Decimal place issues with floats and decimal.Decimal
decimal, floating-accuracy, floating-point, python
Solution
I'm not familiar enough with the Decimal class to help you out, but your problem is due to the fact that decimal fractions can often not be accurate represented in binary, so what you're seeing is the closest possible approximation; there's no way to avoid this problem without using a special class (like Decimal, probably).
`EDIT:` What about the decimal class isn't working properly for you? As long as I start with a string, rather than a float, powers seem to work fine.
>>> import decimal
>>> print(decimal.Decimal("1.2") ** 2)
1.44
The module documentation explains the need for and usage of `decimal.Decimal` pretty clearly, you should check it out if you haven't yet.
Problem
I seem to be losing a lot of precision with floats. For example I need to solve a matrix: ``` 4.0x -2.0y 1.0z =11.0 1.0x +5.0y -3.0z =-6.0 2.0x +2.0y +5.0z =7.0 ``` This is the code I use to import the matrix from a text file: ``` f = open('gauss.dat') lines = f.readlines() f.close() j=0 for line in lines: bits = string.split(line, ',') s=[] for i in range(len(bits)): if (i!= len(bits)-1): s.append(float(bits[i])) #print s[i] b.append(s) y.append(float(bits[len(bits)-1])) ``` I need to solve using gauss-seidel so I need to rearrange the equations for x, y, and z: ``` x=(11+2y-1z)/4 y=(-6-x+3z)/5 z=(7-2x-2y)/7 ``` Here is the code I use to rearrange the equations. `b` is a matrix of coefficients and `y` is the answer vector: ``` def equations(b,y): i=0 eqn=[] row=[] while(i<len(b)): j=0 row=[] while(j<len(b)): if(i==j): row.append(y[i]/b[i][i]) else: row.append(-b[i][j]/b[i][i]) j=j+1 eqn.append(row) i=i+1 return eqn ``` However the answers I get back aren't precise to the decimal place. For example, upon rearranging the second equation from above, I should get: ``` y=-1.2-.2x+.6z ``` What I get is: ``` y=-1.2-0.20000000000000001x+0.59999999999999998z ``` This might not seem like a big issue but when you raise the number to a very high power the error is quite large. Is there a way around this? I tried the `Decimal` class but it does not work well with powers (i.e, `Decimal(x)**2`). Any ideas?