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)
thu*_*.k. 35
由n位整数表示的最大值是2 n -1.如上所述,a在有效数字中float
具有24位精度,这似乎意味着2 24不适合.
但是.
指数范围内2的幂可精确表示为1.0×2 n,因此2 24 可以拟合,因此第一个不可表示的整数为float
2 24 +1.如上所述.再次.