【发布时间】:2016-04-06 13:10:31
【问题描述】:
以下表达式在 C# 中的计算结果为 false:
(1 + 1 + 0.85) / 3 <= 0.95
我认为在大多数其他实现 IEEE 754 的编程语言中也是如此,因为(1 + 1 + 0.85) / 3 的计算结果为0.95000000000000007,大于0.95。
但是,即使 Excel should implement most of IEEE 754 too,以下在 Excel 2013 中的计算结果为 TRUE:
= ((1 + 1 + 0.85) / 3 <= 0.95)
有什么具体原因吗?上面链接的文章没有提到任何可能导致这种行为的 Excel 自定义实现。你能告诉 Excel 严格按照 IEEE 754 进行舍入吗?
请注意,尽管大多数 Excel 问题都应在 superuser.com 上提出,但此问题涉及浮点运算,这是编程语言中的常见问题。从本题的观点来看,Excel 是一种类似于 C# 或 Java 的编程语言。
【问题讨论】:
-
不感兴趣,
= ((1 + 1 + 0.85) / 3 - 0.95)的 Excel 报告什么结果? -
@MarkDickinson
1.11022E-16. -
这篇文章有一个关于 Excel 的部分:cs.berkeley.edu/~wkahan/Mindless.pdf 关键引用:“Excel 的用户如何预测哪些函数作用于显示而不是实际值?哪些表情在显示之前会在外观上变圆?用户的程序在没有意识到这些问题的情况下无法调试,而有意识的用户最终会调试微软的虔诚欺诈,而不仅仅是一个有故障的 Excel 电子表格。”
-
在 Excel 中,
=(1 + 1 + 0.85) / 3将是0.95000000000000,因为它“......在一个数字中仅存储 15 个有效数字,并将第十五位之后的数字更改为零”。见support.microsoft.com/en-us/kb/269370。 -
@AxelRichter:但在实践中似乎并非如此:如果我在单元格 A1 中输入
=(1 + 1 + 0.85) / 3,在单元格 A2 中输入0.95,那么=(A1 - A2)仍然给我显示为1.11022E-16的值。如果存储的值实际上是(最接近的可表示双精度)0.95,那么=(A1 - A2)将给出零。 (尽管=(A1 = A2)确实给了我 TRUE。)Kahan 的引述就在这里。
标签: excel floating-point ieee-754