【问题标题】:Why does Excel not round according to 8-byte IEEE 754Excel为什么不按照8字节IEEE 754四舍五入
【发布时间】: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


【解决方案1】:

article that you linked 明确表示使用接近 0 的值进行非标准操作:

值为零时的示例 1.在Excel 95或更早版本中,在新工作簿中输入以下内容:A1:=1.333+1.225-1.333-1.225

2.右键单击单元格 A1,然后单击设置单元格格式。在数字选项卡上,单击类别下的科学。将小数位数设置为 15。 Excel 95 不显示 0,而是显示 -2.22044604925031E-16。

然而,Excel 97 引入了一项优化,试图纠正 对于这个问题。加法或减法运算的结果 值为零或非常接近零时,Excel 97 及更高版本将 补偿由于转换的结果引入的任何错误 二进制操作数。

未指定的“试图纠正此问题的优化”确实意味着在需要严格遵守 IEEE 754 时,在使用 Excel 进行数值计算时应谨慎使用。也许使用 VBA(不太可能有这种“优化”?)可能是一种解决方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多