python – 浮点数和decimal.Decimal的小数位问题

python – 浮点数和decimal.Decimal的小数位问题,第1张

概述我似乎在漂浮物上失去了很多精确度. 例如,我需要解决一个矩阵: 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: 我似乎在漂浮物上失去了很多精确度.

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

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=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

然而,我得到的答案并不精确到小数位.

例如,在重新排列上面的第二个等式时,我应该得到:

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

我得到的是:

y=-1.2-0.20000000000000001x+0.59999999999999998z

这似乎不是一个大问题,但是当你将数字提高到一个非常高的功率时,错误是非常大的.有没有解决的办法?我尝试过Decimal类,但它不能很好地处理幂(即Decimal(x)** 2).

有任何想法吗?

解决方法 我不太熟悉Decimal类来帮助你,但你的问题是由于十进制分数通常不能用二进制精确表示的事实,所以你看到的是最接近的可能近似值;没有使用特殊类(如Decimal,可能),没有办法避免这个问题.

编辑:十进制类怎么办不适合你?只要我从字符串开始,而不是浮动,权力似乎工作正常.

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

module documentation解释了十进制的需要和用法.很明显,如果你还没有,你应该检查一下.

总结

以上是内存溢出为你收集整理的python – 浮点数和decimal.Decimal的小数位问题全部内容,希望文章能够帮你解决python – 浮点数和decimal.Decimal的小数位问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1191054.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存