python中的舍入错误

Man*_*gia 2 python rounding numerical-computing

为什么乘法的顺序会影响结果?请考虑以下代码

a=47.215419672114173
b=-0.45000000000000007
c=-0.91006620964286644
result1=a*b*c
temp=b*c
result2=a*temp
result1==result2
Run Code Online (Sandbox Code Playgroud)

我们都知道,RESULT1 应该是平等的,以RESULT2,但是我们得到:

result1==result2 #FALSE!
Run Code Online (Sandbox Code Playgroud)

差异很小

result1-result2 #3.552713678800501e-15
Run Code Online (Sandbox Code Playgroud)

但是,对于特定应用程序,此错误可能会放大,以便执行相同计算的两个程序的输出(一个使用result1,另一个使用result2)可能完全不同.

为什么会如此以及如何在数字/科学应用中解决这些问题呢?

谢谢!

UPDATE

很好的答案,但我还是很怀念的原因,为什么顺序的乘法问题,如

temp2=a*b
result3=temp2*c
result1==result3 #True
Run Code Online (Sandbox Code Playgroud)

所以似乎编译器/解释器将*b*c视为(a*b)*c

Sil*_*Ray 9

将浮点数从十进制表示转换为二进制表示时,所有编程语言都会失去精度.这导致计算不准确(至少从基础10的角度来看,因为数学实际上是以二进制表示的浮点值完成的),包括操作顺序改变结果的情况.大多数语言提供数据结构以维持基本10精度,但代价是性能.Decimal用Python 看一下.

编辑:

在回答您的更新时,不完全是.计算机按顺序执行操作,因此当您为它们提供一系列操作时,它们将按顺序逐行执行.除了顺序命令处理之外,没有明确的操作顺序.


Mar*_*som 6

每次乘法产生的数字(或位)是原始数字的两倍,需要进行舍入,以便它适合返回为浮点数分配的空间.重新排列订单时,此舍入可能会更改结果.


Lan*_*aru 5

当您在任何编程语言中使用浮点数字时,都会失去精度。您可以:

适应精度损失,并相应地调整相等性检查,如下所示:

 are_equal = (result1-result2)>0.0001
Run Code Online (Sandbox Code Playgroud)

其中0.0001(ε)是您设置的值。

或使用python随附的Decimal类,速度会慢一些。

  • +1显示在99%的情况下应如何进行浮点相等性检查 (3认同)