谷歌工作表是否比微软Excel更准确



我知道浮点数字不准确的一般问题,但我希望Excel和Google Sheets的表现相同。不幸的是,他们没有看到以下例子:

A1: 15.525         our reference
A2: =3*5.175       should equal 15.525
A3: =A2=A1         shows TRUE, as expected, in both
A4: =A2-A1         but A2 is actually smaller in Google Sheets, by -1.78E-15 [Excel shows 0.00E+00]
B1: =ROUND(A1,2)   shows 15.53, correct, in both
B2: =ROUND(A2,2)   shows 15.53, correct, in both - surprisingly in Google Sheets, looking at A4
B3: =B2=B1         shows TRUE, as expected, in both
C1: =B1-A1         shows 0.00499999999999901, in both
C2: =B2-A2         shows 0.00500000000000078, in both
C3: =C2=C1         shows FALSE, as expected, in both
D1: =C1<0.005      consistent with C1, in both
D2: =C2>0.005      consistent with C2, but inconsistent with correct rounding in B2, in both

那么,显而易见的问题是什么呢?

  • A3:Google Sheets说,具有非零差的数字是相等的(不寒而栗)
  • A4:Excel显示行为不同的数字(C1、C2等)之间的差异为零
  • B2/D2:都向上取整一个比取整的数字小0.005以上的数字

我的问题是:

  • 我应该期望两人的行为有所不同吗
  • 差异是不同实现(可能是数字格式)的无意副产品,还是有意的
  • 这有记录吗

观测

以下观察结果是在Google Sheets(2020-07-02网络版,macOS 10.14.6上的Safari 12.1.2)、适用于Mac 12.3.6的Microsoft Excel 2008和Numbers 10.0上进行的。在Excel中,首选项…>计算>"按显示设置精度"被禁用。

单元格已设置:

  • A1:15.525
  • A2:=3*5.175
  • A3:=A2=A1
  • A4:=A2-A1
  • A5:=(A2-A1)
  • A6:=A4*1000000000000000
  • A7:=A5*1000000000000000
  • A8:=(1/3*3-1)*POWER(10,34)

观察到的结果为:

  • A3:在所有三个电子表格中均为"TRUE">
  • A4:三个电子表格中均为"0">
  • A5:谷歌表格中的"0",Excel中的"-177636E-15",数字中的"零">
  • A6:谷歌表格中的"-1776356839",Excel中的"0",数字中的"零">
  • A7:谷歌表格中的"-1776356839",Excel中的"-1.76356839,数字中的"0">
  • A8:谷歌表格中的"0",Excel中的"零",数字中的"-1">

如果单元格格式从"自动"更改为"科学",则Google Sheets结果将更改:

  • A4:"-1.78E-15">
  • A5:"-1.78E-15">

否则,除外观更改外,其他单元格或电子表格中没有任何更改,例如显示"0.00E+00"而不是"0"。

假设

上述观察结果与一致

  • Google Sheets使用IEEE-754 64位二进制格式,不会篡改舍入。("0"的初始显示是由于自动选择定点或类似格式。)
  • Excel使用IEEE-754 64位二进制格式,并根据使用的公式进行舍入。也就是说,四舍五入不仅仅是被四舍五舍五入的数字的函数;它依赖于上下文。此外,舍入不仅仅是为了显示;它应用于单元格值,因此进一步的计算使用后舍入结果
  • Numbers使用十进制浮点格式,有效位为34位。未观察到伪造的舍入

进一步调查

在Google Sheets和Excel中观察到的−1.776356839•10−15值是IEEE-754 64位二进制格式的特征,因此他们很可能使用该格式。在数字中观察到的−10−34值不太具有决定性,因此应该进一步研究它使用十进制格式的假设。

以上注释在Excel中对接近零的数字进行四舍五入,四舍五进后的值用于进一步计算。另一个实验是构造一个不是一但显示为一但有一个简单公式的数字,然后在进一步的计算中使用该单元格,看看是使用了四舍五入前值还是使用了四入后值。

更多观察

单元格已设置:

  • B1:=1/49*49-1
  • B2:=1/49*49
  • B3:=B2-1
  • 之所以选择

49,是因为当使用IEEE-754二进制64进行评估时,1/49*49产生的数字略低于1。(较小的分母(如1/3*3)不会出现这种情况,因为尽管除法中有舍入,但乘法中也有舍入进行补偿,从而产生恰好为1的结果。49是不发生这种情况的最小整数。)

结果,采用科学格式:

  • B1:谷歌表格中的"-1.11E-16",Excel中的"0.00E+00",数字中的"-2E-34">
  • B2:谷歌表格中的"1.00E+00",Excel中的"1.00 E+00",数字中的"1E+00">
  • B3:谷歌表格中的"-1.11E-16",Excel中的"0E+00",数字中的"0.00E+00

再一次,Google Sheets似乎使用了IEEE-754,没有任何恶作剧。Excel似乎已将结果四舍五入。但是,如果添加括号,将B1设置为=(1/49*49-1)或将B3设置为=(B2-1),Excel将显示"-1.11E-16"。这与在第一组观测中使用括号时禁用舍入一致。

然而,现在我们第一次在数字中看到一些恶作剧。我们期望B1和B3显示相同的结果,但它们没有。假设:数字在公式中使用更高的精度,但在单元格的最终结果中使用更少的精度?

B1结果与小数点后34位数字一致。对于34位有效的十进制数字,1/49为02040816326530612244897959183673469。然后是49倍,即99999999999999999999。四舍五入到34位有效数字得到.999999999999999999 8,然后减去1得到−2•10−34

进一步的实验(此处未详细说明)建议Numbers使用34位小数进行内部计算,但将最终单元格值四舍五入到15位小数,并将其用于显示和进一步计算。

这有记录吗?

我能找到的唯一一篇文档是Excel中关于浮点运算可能在Excel中给出不准确结果的这篇文章。从那里,我们可以就你剩下的问题得出一些结论。

我应该期望两者表现不同吗?

是的,最有可能的实现是不同的。

差异是不同实现(可能是数字格式)的无意副产品,还是有意的?

可能是由于实现限制。我不认为他们会故意返回不准确的地方。

谷歌工作表是否比Microsoft Excel更准确?

为了测试准确性,我们需要手动或使用可靠的计算器进行计算,然后将其与Excel和Google Sheets给出的结果进行比较。我们还需要在一系列公式和运算中测试这种准确性,以便得出一致的结论。

最新更新