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

Pol*_*ial 5 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
Run Code Online (Sandbox Code Playgroud)

自己尝试一下 - 这很奇怪!

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

Bru*_*son 3

Windows 计算器中的算术很糟糕。它不符合 IEEE 标准,事实上,它忽略了 IEEE 规范的所有教训。

或者,至少,它忽略了一个重要的教训:正确的舍入确实很重要。

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

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

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

  1. 它计算平方根的精度约为 40 位。
  2. 它无法正确舍入。

40 位数字比双精度数要精确得多,有时这很好,但 squareroot(4) 表明,如果没有正确的舍入,额外的“精度”可能会被误导。正确舍入基本运算(+、-、*、/)和平方根相对简单。不这样做就是马虎。

至于原来的问题,如果你使用“-1”技巧来查看真实值,当计算器说答案是 1 时,你会看到这个数字逐渐接近 1。最终,可怕的舍入导致它去少于一。然后发生了一些不好的事情,它就降到了零。我不知道坏事是什么,但鉴于其四舍五入不佳,发生坏事也就不足为奇