请考虑以下代码:
0.1 + 0.2 == 0.3 -> false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2 -> 0.30000000000000004
Run Code Online (Sandbox Code Playgroud)
为什么会出现这些不准确之处?
我希望a四舍五入到13.95.
>>> a
13.949999999999999
>>> round(a, 2)
13.949999999999999
Run Code Online (Sandbox Code Playgroud)
该round功能不像我预期的那样工作.
我似乎在漂浮物上失去了很多精确度.
例如,我需要解决一个矩阵:
4.0x -2.0y 1.0z =11.0
1.0x +5.0y -3.0z =-6.0
2.0x +2.0y +5.0z =7.0
Run Code Online (Sandbox Code Playgroud)
这是我用来从文本文件导入矩阵的代码:
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]))
Run Code Online (Sandbox Code Playgroud)
我需要使用gauss-seidel解决,所以我需要重新排列x,y和z的方程式:
x=(11+2y-1z)/4
y=(-6-x+3z)/5
z=(7-2x-2y)/7
Run Code Online (Sandbox Code Playgroud)
这是我用来重新排列方程的代码.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
Run Code Online (Sandbox Code Playgroud)
然而,我得到的答案并不精确到小数位.
例如,在重新排列上面的第二个等式时,我应该得到:
y=-1.2-.2x+.6z
Run Code Online (Sandbox Code Playgroud)
我得到的是:
y=-1.2-0.20000000000000001x+0.59999999999999998z
Run Code Online (Sandbox Code Playgroud)
这似乎不是一个大问题,但是当你将数字提高到一个非常高的功率时,错误是非常大的.有没有解决的办法?我尝试了这个Decimal课程,但是它在功能方面效果不佳(即Decimal(x)**2 …
可能重复:
浮点限制
在这里使用Python 2.7.
谁能解释为什么在shell中发生这种情况?
>>> 5.2-5.0
0.20000000000000018
Run Code Online (Sandbox Code Playgroud)
搜索关于没有产生正确的结果(一个非常小的数字和一个非常大的数字)数量的不同尺度得到的东西,但似乎很一般,而且考虑到我使用的数字是相同的规模,我不认为这就是为什么会发生这种情况.
编辑:我想我没有定义"发生这件事"我的意思是它返回0.2 ... 018而不是简单地导致0.2.我得到了打印轮次,并删除了代码段中的打印部分,因为这会产生误导.
在ghci终端中,我使用sqrt函数计算了一些使用Haskell的方程式.
我注意到sqrt,当我的结果被简化时,我有时会失去精确度.
例如,
sqrt 4 * sqrt 4 = 4 -- This works well!
sqrt 2 * sqrt 2 = 2.0000000000000004 -- Not the exact result.
Run Code Online (Sandbox Code Playgroud)
通常情况下,我会期待结果2.
有没有办法获得正确的简化结果?
这在Haskell中如何工作?
我的问题更多是关于为什么在C++,C#和VB中
std::cout<<2.2f*3.0f<<std::endl; //prints 6.6
Run Code Online (Sandbox Code Playgroud)
在Python,Java和Ruby中
2.2*3.0 //prints 6.6000000000000005
Run Code Online (Sandbox Code Playgroud)
我对内存中的浮点表示非常熟悉.我检查过,事实上2.2无法用单精度精确表示在内存中.
但是为什么C++,C#和VB在打印值时会切断结果中不相关的部分而其他部分却没有?