Excel浮点行为的规范

时间:2016-10-27 20:50:27

标签: excel floating-point

虽然Excel使用标准的IEEE754二进制64格式,但它并没有使用相同的算术和比较规则,例如:

=0.1+0.2=0.3

返回TRUEother examples

在任何地方都记录了确切的行为吗?

2 个答案:

答案 0 :(得分:1)

本文档切向解决了这个问题:

https://support.microsoft.com/en-us/kb/78113

特别参见:

  然而,

Excel 97引入了一种尝试纠正的优化   对于这个问题。应该进行加法或减法运算   在值为或非常接近零,Excel 97及更高版本将   补偿由于转换而引入的任何错误   来自二进制文件的操作数。

如果他们将此“优化”应用于0.1 + 0.20.3之间的差异,则显然会将其转换为0,这意味着他们并未严格遵守标准。

答案 1 :(得分:1)

做了一些实验后,我确定了以下行为:

  1. 如果等值运算符(=)等于15个有效十进制数字(即printf术语中的"%.14e"),则两个值“相等”

    • 小于(<)且小于或等于(<=)被定义为与此一致(即如果在IEEE算术下为真,则“Excel小于”为真,并且值不是“Excel相等”)。
  2. 如果单元格公式中的最终运算符(根据通常的运算符优先级)为-+,则结果的大小小于8 ulps(最后位置的单位) )第一个参数,然后结果设置为零。

    • 通过将整个表达式包装在括号中可以抑制此行为(或者等效地,您可以将此类包装括号视为运算符)。
  3. SUM似乎与+的链式序列的行为相同(阈值似乎是累积和的倒数第二个元素的8个核心),但是截断无法通过括起括号来抑制。

  4. 请注意,这些值不一致,因为值可能是“Excel相等”但具有非零差异,反之亦然。

    因此,如果您想在Excel中更接近IEEE算法:

    • 将所有公式包装在最后的括号中

    • 使用(a-b)<0代替a<b(对于其他布尔运算符也类似)

    • 避免使用SUM

    (由于缺少次正规和有符号零,这仍然不会很严格)