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
将浮点数从十进制表示转换为二进制表示时,所有编程语言都会失去精度.这导致计算不准确(至少从基础10的角度来看,因为数学实际上是以二进制表示的浮点值完成的),包括操作顺序改变结果的情况.大多数语言提供数据结构以维持基本10精度,但代价是性能.Decimal用Python 看一下.
编辑:
在回答您的更新时,不完全是.计算机按顺序执行操作,因此当您为它们提供一系列操作时,它们将按顺序逐行执行.除了顺序命令处理之外,没有明确的操作顺序.
当您在任何编程语言中使用浮点数字时,都会失去精度。您可以:
适应精度损失,并相应地调整相等性检查,如下所示:
are_equal = (result1-result2)>0.0001
Run Code Online (Sandbox Code Playgroud)
其中0.0001(ε)是您设置的值。
或使用python随附的Decimal类,速度会慢一些。
| 归档时间: |
|
| 查看次数: |
967 次 |
| 最近记录: |