计算器中有趣的浮动错误 - 为什么会发生这种情况?

时间:2013-01-22 14:01:34

标签: floating-point ieee-754

如果在Windows计算器中输入1.0000000000000000000000000000001,然后反复点击阶乘(n!)按钮,会得到一些奇怪的结果:

1.0000000000000000000000000000001 [n!]
1                                 [n!]
1                                 [n!]
1                                 [n!]
0.9999999999999999999999999999997 [n!]
0.9999999999999999999999999999998 [n!]
0                                 [n!]
1

亲自尝试 - 这很奇怪!

我的主要兴趣是为什么我们在倒数第二步得到零。 IEEE浮动的人为因素会导致这些问题吗?

1 个答案:

答案 0 :(得分:2)

Windows计算器中的算法非常糟糕。它不符合IEEE标准,事实上,它忽略了IEEE规范的所有课程。

或者,至少,它忽略了一个重要的教训:适当的舍入真的很重要。

尝试输入此内容(在科学模式下):

  • 4
  • 平方根(答案显示为2)
  • -2(-8.1648465955514287168521180122928e-39)

这告诉我们关于Windows计算器的两件事。

  1. 它计算平方根到大约40位精度。
  2. 无法正确回合。
  3. 40位数比双倍数字更精确,有时候这是好的,但是squareroot(4)表明如果没有正确的舍入,那么额外的精确度就会很高。可能被误导了。正确舍入基本操作(+, - ,*,/)和平方根是相对简单的。不这样做只是草率。

    关于原始问题,如果你使用" -1"当计算器表示答案为1时,你会看到数字逐渐接近1,从而看到真正的价值。最后,它的可怕舍入导致它不到1。然后发生了一些不好的事情并且它达到零。我不知道坏事是什么,但鉴于其糟糕的四舍五入,某事不好发生就不足为奇了。