提问人:bers 提问时间:7/1/2020 最后编辑:TheMasterbers 更新时间:8/21/2023 访问量:1396
Google 表格比 Microsoft Excel 更准确还是更准确?
Is Google Sheets less or more accurate than Microsoft Excel?
问:
我知道浮点数的数值不准确的一般问题,但我希望 Excel 和 Google 表格的行为相同。不幸的是,他们没有 - 请参阅以下示例:
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:谷歌表格说,具有非零差异的数字是相等的(不寒而栗)
- A4:Excel 显示行为不同的数字(C1、C2 等)之间的零差异
- B2/D2:两者都对比四舍五入数字小 0.005 以上的数字进行四舍五入
我的问题是:
- 我应该期望两者的行为不同吗?
- 差异是不同实现(可能是数字格式)的无意副产品,还是有意为之?
- 这在某处有记录吗?
答:
这在某处有记录吗?
我能找到的唯一文档是 Excel 中关于浮点运算的这篇文章,可能会在 Excel 中给出不准确的结果。从那里,我们可以就您的其余问题得出一些结论。
我应该期望两者的行为不同吗?
是的,很可能实现是不同的。
差异是不同实现(可能是数字格式)的无意副产品,还是有意为之?
它们可能是由于实现限制。我不认为他们会故意返回不准确的内容。
Google 表格比 Microsoft Excel 更准确还是更准确?
为了测试准确性,我们需要手动或使用良好且值得信赖的计算器进行计算,然后将其与 Excel 和 Google 表格给出的结果进行比较。我们还需要在一系列公式和运算上测试这种准确性,以便能够得出一致的结论。
观察
以下观察是在谷歌表格(2020-07-02的网页版,macOS 10.14.6上的Safari 12.1.2),Microsoft Excel 2008 for Mac 12.3.6和Numbers 10.0上进行的。在 Excel 中,首选项...> “设置显示的精度”>计算被禁用。
单元格已设置:
- A1:。
15.525
- 答2: .
=3*5.175
- 答3: .
=A2=A1
- 答4: .
=A2-A1
- 答5: .
=(A2-A1)
- 答6: .
=A4*1000000000000000
- 答7: .
=A5*1000000000000000
- 答8: .
=(1/3*3-1)*POWER(10,34)
观察到的结果是:
- A3:所有三个电子表格中的“TRUE”。
- A4:所有三个电子表格中的“0”。
- A5:Google 表格中的“0”,Excel 中的“-1.77636E-15”,Numbers 中的“0”。
- A6:Google 表格中的“-1.776356839”,Excel 中的“0”,Numbers 表格中的“0”。
- A7:Google 表格中的“-1.776356839”,Excel 中的“-1.776356839”,Numbers 表格中的“0”。
- A8:Google 表格中的“0”,Excel 中的“0”,Numbers 表格中的“-1”。
如果单元格格式从“自动”更改为“科学型”,则 Google 表格结果会发生变化:
- A4:“-1.78E-15”。
- A5:“-1.78E-15”。
否则,除了外观更改(例如显示“0.00E+00”而不是“0”)外,其他单元格或电子表格中不会有任何更改。
假设
上述观察结果与以下观点一致:
- Google 表格使用 IEEE-754 64 位二进制格式,不会弄虚入。(最初显示“0”是由于自动选择定点或类似格式。
- Excel 使用 IEEE-754 64 位二进制格式,并根据使用的公式对舍入进行模糊处理。也就是说,四舍五入不纯粹是被四舍五入的数字的函数;它依赖于上下文。此外,四舍五入不仅是为了展示;它应用于单元格值,因此进一步的计算将使用舍入后的结果。
- Numbers 使用十进制浮点格式,有效数字为 34 位。没有观察到模糊的四舍五入。
进一步调查
在 Google 表格和 Excel 中观察到的 −1.776356839•10−15 值是 IEEE-754 64 位二进制格式的特征,因此他们很可能正在使用该格式。在 Numbers 中观察到的 −10−34 值不太确定,因此应进一步研究它使用十进制格式的假设。
上面的注释在 Excel 中对接近零的数字进行舍入,四舍五入后的值用于进一步的计算。另一个实验是构造一个不是 1 但显示为 1 但具有简单公式的数字,然后在进一步计算中使用该单元格,以查看是否使用了舍入前或舍入后的值。
更多观察结果
单元格已设置:
- B1:.
=1/49*49-1
- B2:.
=1/49*49
- B3:.
=B2-1
之所以选择 49,是因为当使用 IEEE-754 二进制 64 进行评估时,生成的数字略低于 1。(对于较小的分母,例如 with 不会发生这种情况,因为尽管除法中有四舍五入,但乘法中也存在四舍五入来补偿,从而产生正好为 1 的结果。49 是不会发生这种情况的最小整数。1/49*49
1/3*3
结果,采用科学格式:
- B1:Google 表格中的“-1.11E-16”,Excel 中的“0.00E+00”,Numbers 表格中的“-2E-34”。
- B2:Google 表格中的“1.00E+00”、Excel 中的“1.00E+00”、Numbers 中的“1E+00”。
- B3:Google 表格中的“-1.11E-16”,Excel 中的“0E+00”,Numbers 中的“0.00E+00”。
同样,Google 表格似乎使用 IEEE-754 没有任何恶作剧。Excel 似乎已对结果进行了四舍五入。但是,如果添加括号,将 B1 设置为 或 B3 设置为 ,Excel 将显示“-1.11E-16”。这与在第一组观测值中使用括号时禁用舍入一致。=(1/49*49-1)
=(B2-1)
然而,现在我们第一次在民数记中看到了一些恶作剧。我们预计 B1 和 B3 会显示相同的结果,但事实并非如此。 假设:数字在公式中使用更高的精度,但对单元格的最终结果使用更少的精度?
B1 结果与 34 位十进制数字一致。对于 34 位有效十进制数字,1/49 是 .02040816326530612244897959183673469。然后是 49 倍,即 .99999999999999999999999999999999981。四舍五入到 34 位有效数字得到 .9999999999999999999999999999999998,然后减去 1 得到 -2•10−34。
进一步的实验(此处未详述)表明,Numbers 在内部使用 34 位十进制数字进行计算,但将最终单元格值四舍五入为 15 位十进制数字,并将其用于显示和进一步计算。
评论