哪个是IEEE 754浮点数不能精确表示的第一个整数?
为了清楚起见,如果我使用的是实现IEE 754浮点数的语言,我声明:
float f0 = 0.f; float f1 = 1.f;
…然后打印出来,我会得到0.0000和1.0000 – 确切地说。
但是IEEE 754不能代表真实线路上的所有数字。 接近于零,“差距”很小; 随着你越走越远,差距就越大。
所以,我的问题是: 对于一个IEEE 754浮点数,它是第一个(最接近零)的整数,不能被精确表示? 我现在只关心32位浮点数,尽pipe如果有人给出64位的话,我会有兴趣听到64位的答案!
我认为这将会像计算2 bits_of_mantissa和加 1一样简单,其中bits_of_mantissa是标准暴露多less位。 我为我的机器上的32位浮点数(MSVC ++,Win64)做了这个,看起来不错。
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
由n位整数表示的最大值是2 n -1。 如上所述, float
在有效数中有24位的精度,这似乎意味着2 24不适合。
但是 。
指数范围内的2的幂恰好可以表示为1.0×2 n ,所以2 24 可以拟合,因此float
的第一个不能表示的整数是2 24 +1。 如上所述。 再次。