gpt4 book ai didi

python - float 和 decimal.Decimal 的小数位问题

转载 作者:行者123 更新时间:2023-11-28 19:30:34 30 4
gpt4 key购买 nike

我似乎失去了很多 float 的精度。

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

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)。

有什么想法吗?

最佳答案

IEEE float 是二进制的,不是十进制的。没有固定长度的二进制小数正好是 0.1 或其任何倍数。它是一个重复分数,如十进制的 1/3。

请阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic

除了 Decimal 类之外的其他选项是

  • 使用 Common Lisp 或 Python 2.6或另一种具有精确有理数的语言

  • 使用例如 frap 将 double 转换为闭有理数

关于python - float 和 decimal.Decimal 的小数位问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/286061/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com