python – 浮点数和decimal.Decimal的小数位问题
发布时间:2020-12-20 10:33:51 所属栏目:Python 来源:网络整理
导读:我似乎在漂浮物上失去了很多精确度. 例如,我需要解决一个矩阵: 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
我似乎在漂浮物上失去了很多精确度.
例如,我需要解决一个矩阵: 4.0x -2.0y 1.0z =11.0 1.0x +5.0y -3.0z =-6.0 2.0x +2.0y +5.0z =7.0 这是我用来从文本文件导入矩阵的代码: 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])) 我需要使用gauss-seidel解决,所以我需要重新排列x,y和z的方程式: x=(11+2y-1z)/4 y=(-6-x+3z)/5 z=(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解释了十进制的需要和用法.很明显,如果你还没有,你应该检查一下. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |