给定两个浮点数,如何检测计算中精度何时丢失?

时间:2017-11-28 12:19:42

标签: floating-point precision

考虑代表exact numbers (not approximations)的64位/ 8字节/双IEEE浮点数。

我使用JS并拥有access to the mantissa, exponent

我对浮点运算(加法,减法,乘法,除法)的正确使用感兴趣。

关于浮动的以下是否正确:

  • 您只能在二分浮点数中表示精确的十进制数,其中分母的幂是2
  • 只有在两个数字都处于相同的“精度窗口”或比例尺时进行计算才有意义。例如。用其他非常小的数字计算的非常小的数字?从来没有非常大的数字和非常小的数字?

那么我如何以编程方式检测数字是否在同一个精度/比例窗口中?

是否有可能在非常大和非常小的数字之间找到确切的数字,或者该计算是否停留在(large/2),因为((large+small)/2)取消了较小的数字?

1 个答案:

答案 0 :(得分:3)

  

您只能在二分浮点数中表示精确的十进制数,其中分母是2的幂

是的!这通常来自浮点数的定义。当然,并非所有具有2次幂分母的数字都可以完全表示为binary64浮点数。

  

当两个数字都处于相同的精确度窗口时进行计算才有意义。或规模。例如。用其他非常小的数字计算的非常小的数字?从来没有非常大的数字和非常小的数字?

当特别考虑加法和减法时,这大致是正确的。特别是我引用Sterbenz的定理,大概是:如果你从另一个数中减去一个数,而这两个数在2之内,结果就是精确的。但是,这只是一个充分条件,而不是必要条件。更一般地,在没有扩展精度的浮点上下文中计算的((a+b) - a) - b产生零的情况下,添加是精确的。有关此类事情的详情,请参阅Kahan's summation algorithm

对于乘法,它实际上很容易检查错误。右移每个有效数,直到其LSB为1,然后乘以两个移位的有效数,如果结果为2 ^ 53或更大,则进行舍入。您可以进行相同类型的基于有效数据的"试运行"使用加法/减法,但首先你需要通过指数的差异来移动较大的有效数(然后你需要右移两个有效数,直到在LSB中有一个1)。

对于分工,它更容易。你已经注意到只有具有2分之幂分母的有理数才能完全代表。因此,如果您将非零数除以不是2的幂的数(即具有非零尾数),则进行舍入,除非您可以将右移有效数除以整数。 / p>

请注意,在所有这些中,我一直忽视下溢和溢出,并在地毯下扫描非规范化输入。如果你想正确地做到这一点,你真的需要一本关于浮点计算的好书。我可以推荐Higham"数值算法的准确性和稳定性"。