考虑代表exact numbers (not approximations)的64位/ 8字节/双IEEE浮点数。
我使用JS并拥有access to the mantissa, exponent。
我对浮点运算(加法,减法,乘法,除法)的正确使用感兴趣。
关于浮动的以下是否正确:
那么我如何以编程方式检测数字是否在同一个精度/比例窗口中?
是否有可能在非常大和非常小的数字之间找到确切的数字,或者该计算是否停留在(large/2)
,因为((large+small)/2)
取消了较小的数字?
答案 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"数值算法的准确性和稳定性"。