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

Floating point 计算器中有趣的浮点错误-为什么会发生这种情况?,floating-point,ieee-754,Floating Point,Ieee 754,如果在Windows计算器中输入1.0000000000000000000000001,然后反复点击阶乘(n!)按钮,则会得到一些奇怪的结果: 1.0000000000000000000000000000001 [n!] 1 [n!] 1 [n!] 1 [n!] 0.99999999999999999999

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

1.0000000000000000000000000000001 [n!]
1                                 [n!]
1                                 [n!]
1                                 [n!]
0.9999999999999999999999999999997 [n!]
0.9999999999999999999999999999998 [n!]
0                                 [n!]
1
你自己试一试——这很奇怪


我的主要兴趣是为什么我们在第二步到最后一步得到零。IEEE浮动的什么人工制品导致了这些问题?

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

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

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

  • 四,
  • 平方根(答案显示为2)
  • -2(-8.16484659555142871685211180122928E-39)
这告诉我们关于Windows计算器的两件事

  • 它计算的平方根精度约为40位
  • 它不能正确地旋转
  • 40位数的精度比双精度高很多,有时这是好的,但平方根(4)表明,如果没有正确的舍入,额外的“精度”可能会被误导。对基本运算(+、-、*、/)和平方根进行四舍五入比较简单。不这样做只是马虎


    至于最初的问题,如果你使用“-1”技巧来查看真实值,当计算器说答案是1时,你会看到数字逐渐接近1。最终,糟糕的四舍五入会导致它小于一。然后坏事情发生了,它降到了零。我不知道什么是不好的东西,但考虑到它的舍入不好,不好的事情发生也就不足为奇了。

    也许它在某种程度上使用了,来计算那些阶乘,而明显的整数值(
    1
    )是实际值的舍入表示。它看起来确实在试图计算Pi函数。如果按
    0.5
    ,则按
    ±
    然后按
    n
    然后
    ,要计算此上下文中称为
    sqr(事实(-0.5))
    ,您将得到
    3.14159…
    。但是数字
    0
    出来还是很愚蠢的。是的,很难想象一个浮点算法不将4的平方根精确计算为2,不管精度如何。