【发布时间】:2012-07-24 20:20:28
【问题描述】:
为什么乘法的顺序会影响结果?考虑以下代码
a=47.215419672114173
b=-0.45000000000000007
c=-0.91006620964286644
result1=a*b*c
temp=b*c
result2=a*temp
result1==result2
我们都知道 result1 应该等于 到 result2,但是我们得到:
result1==result2 #FALSE!
差别很小
result1-result2 #3.552713678800501e-15
但是,对于特定应用程序,此错误可能会放大,因此执行相同计算的两个程序(一个使用结果1,另一个使用结果2)的输出可能完全不同。
为什么会这样?可以做些什么来解决大量数值/科学应用中的此类问题?
谢谢!
更新
很好的答案,但我仍然想念为什么乘法的顺序很重要的原因,例如
temp2=a*b
result3=temp2*c
result1==result3 #True
所以编译器/解释器似乎将 a*b*c 视为 (a*b)*c
【问题讨论】:
-
比较机器表示的浮点数的 exact 相等性会让宇宙不开心,我的朋友。
-
@Mannaggia - 这里有一些链接可能有助于理解您注意到的行为:The Perils of Floating Point, Floating Point Arithmetic: Issues and Limitations
-
@Marcin:好的,但是如果一个人只能在他/她掌握的领域提问,那么这个博客的作用是什么?我的问题是关于操作的 排序 以及这如何影响精度,我知道实数不能用二进制形式表示,这与任何 IEEE 无关标准(这只是一个约定),但二进制(或三进制,如果你想)编码系统。
-
@Marcin 他最初的问题是教科书中没有列出的——如果他甚至知道在哪里可以找到这些信息——因为他的问题是为什么一组计算他认为在哪里执行相同的硬件操作会产生略微不同的结果。答案需要了解操作顺序和硬件不准确性。对我来说,这似乎是一个非常合理的问题。
标签: python rounding numerical-computing