浮点:我可以递归地将多个数字除以2而不会出现舍入错误吗?

时间:2017-11-26 12:19:11

标签: javascript sqlite floating-point precision

http://floating-point-gui.de/formats/binary/

  

二进制只能将那些数字表示为有限分数,其中分母是2的幂

这是否意味着此过程计算出的数字可以相互相加或者相乘2次,并且仍然具有精确的二进制/浮点表示而没有舍入错误?

const dv2 = (num, limit) => {
    limit--;
    if (limit === 0) {
        return;
    } else {
        console.log(num, limit);
        dv2((num / 2), limit)
    }
};

是否可以确定浮点数何时精确或近似?

1 个答案:

答案 0 :(得分:4)

是的,只要您使用二进制浮点(例如非常常见的IEEE-754二进制浮点)并且不会溢出到无穷大或下溢到次正规数。在二进制浮点数中,乘以或除以2是精确的,直到达到指数限制。

对于32位IEEE-754二进制文件,有限正态值上升到2 128 -2 104 并且下降到2 -126 。 (有正低于2 -149 的正常低于正常值,但它们的有效位数[小数部分]中的位数比正常数字少,因此精度会降低。)

对于64位IEEE-754二进制文件,有限正态值上升到2 1024 -2 971 并下降到2 -1022 。 (有正负的正常值低至2 -1074 。)

没有办法(没有上下文)来确定浮点数是准确表示还是仅接近某些先前的数字。 (有一种方法可以检测浮点运算何时对结果进行舍入。在编程语言的实现中,通常忽略访问此附加信息。)一旦将数字转换为浮点数,浮点数就会精确表示它代表什么。它不包含有关先前发生的舍入错误量的信息。 (如果您有关于先前号码的其他信息,例如它来自带有五位有效数字的十进制数字,那么您可以推断出有关原始号码的信息。)