首页 文章

哪个是IEEE 754浮点数无法准确表示的第一个整数?

提问于
浏览
132

为清楚起见,如果我使用的是实现IEE 754浮点数的语言,我声明:

float f0 = 0.f;
float f1 = 1.f;

...然后将它们打印出来,我会得到0.0000和1.0000 - 完全正确 .

但IEEE 754无法表示实线上的所有数字 . 接近于零,“差距”很小;当你越走越远时,差距越来越大 .

所以,我的问题是: for an IEEE 754 float, which is the first (closest to zero) integer which cannot be exactly represented? 我'm only really concerned with 32-bit floats for now, although I'有兴趣听到有人给出64位的答案!

我认为这就像计算2bits_of_mantissa并添加1一样简单,其中bits_of_mantissa是标准公开的位数 . 我在我的机器(MSVC,Win64)上为32位浮点数做了这个,但它看起来很好 .

2 回答

  • 160

    2mantissa位1 1

    指数中的1(尾数位1)是因为,如果尾数包含 abcdef... ,它表示的数字实际上是 1.abcdef... × 2^e ,提供额外的隐式精度位 .

    对于 float ,它是16,777,217(224 1) .
    对于 double ,它是9,007,199,254,740,993(253 1) .

    >>> 9007199254740993.0
    9007199254740992
    
  • 30

    由n位整数表示的最大值是2n-1 . 如上所述, float 在有效数字中具有24位精度,这似乎意味着224不适合 .

    然而 .

    指数范围内的2的幂可以精确地表示为1.0×2n,因此224可以拟合,因此 float 的第一个不可表示的整数是224 1.如上所述 . 再次 .

相关问题