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

Flo*_*omi 152 floating-point types ieee-754

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

float f0 = 0.f;
float f1 = 1.f;
Run Code Online (Sandbox Code Playgroud)

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

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

所以,我的问题是:对于一个IEEE 754浮点数,这是第一个(最接近零)整数,无法准确表示?我现在只关心32位浮点数,虽然如果有人给出它我会有兴趣听到64位的答案!

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

ken*_*ytm 189

2个尾数位+ 1 + 1

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

因为float,它是16,777,217(2 24 + 1).
因为double,它是9,007,199,254,740,993(2 53 + 1).

>>> 9007199254740993.0
9007199254740992
Run Code Online (Sandbox Code Playgroud)

  • @sodiumnitrate检查问题标题.16777217是第一个完全无法表示**的整数**. (13认同)
  • 在C++中,那是`(1 << std :: numeric_limits <float> :: digits)+ 1`,在C中,`(1 << FLT_MANT_DIG)+ 1`.前者很好,因为它可以是模板的一部分.如果您只想要最大的可表示整数,请不要添加+1. (5认同)
  • 下一个整数确实是16777218,因为2现在成为最后一个重要的二进制数字. (4认同)
  • 我声明了一个“float”并将其设置为 16,777,217。但是当我使用“cout”打印它时,结果是 16,777,216。我正在使用“C++”。为什么我打不到 16,777,217? (3认同)
  • 您可以使用它来检查浮点位表示并找到最小/最大整数值:https://www.h-schmidt.net/FloatConverter/IEEE754.html 这里是另一个用于 16、32、64 和 128 位浮点的值点:http://weitz.de/ieee/ (2认同)

thu*_*.k. 35

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

但是.

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

  • 这清楚地解释了另一个的“额外隐含精度”部分。谢谢。 (2认同)