浮点数和小数的小数位问题。

浏览:58日期:2024-03-05
如何解决浮点数和小数的小数位问题。?

我对Decimal类还不够熟悉,无法为您提供帮助,但是您的问题是由于以下事实导致:十进制小数通常无法以二进制形式精确表示,因此您所看到的是最接近的近似值。如果不使用特殊的类(例如,十进制),就无法避免此问题。

EDIT:十进制类对您来说不能正常工作呢?只要我以字符串而不是浮点数开头,幂似乎就可以正常工作。

>>> import decimal>>> print(decimal.Decimal('1.2') ** 2)1.44

该模块文档解释了需要和使用decimal.Decimal非常清楚,你应该检查出来,如果你还没有。

解决方法

我似乎在使用浮点数时失去了很多精度。

例如,我需要求解一个矩阵:

4.0x -2.0y 1.0z =11.01.0x +5.0y -3.0z =-6.02.0x +2.0y +5.0z =7.0

这是我用来从文本文件导入矩阵的代码:

f = open(’gauss.dat’)lines = f.readlines()f.close()j=0for 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]))

我需要使用gauss-seidel进行求解,因此需要重新排列x,y和z的方程式:

x=(11+2y-1z)/4y=(-6-x+3z)/5z=(7-2x-2y)/7

这是我用来重新排列方程式的代码。b是系数矩阵,y是答案向量:

def equations(b,y): i=0 eqn=[] row=[] while(i<len(b)):j=0row=[]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+1eqn.append(row)i=i+1 return eqn

但是,我得到的答案并不精确到小数位。

例如,从上面重新排列第二个方程式后,我应该得到:

y=-1.2-.2x+.6z

我得到的是:

y=-1.2-0.20000000000000001x+0.59999999999999998z

这看起来似乎不是一个大问题,但是当您将数字提高到很高的功率时,误差会很大。有没有解决的办法?我曾尝试过该Decimal课程,但它不能与各种功能(即Decimal(x)**2)配合使用。

有任何想法吗?

相关文章: