为清楚起见,如果我使用的是实现 IEE 754 浮点数的语言并声明:
float f0 = 0.f; float f1 = 1.f;
…然后将它们打印出来,我会得到 0.0000 和 1.0000 - 完全正确。
但是 IEEE 754 不能代表实线上的所有数字。接近于零,“差距”很小;当你越走越远,差距就越大。
所以,我的问题是: 对于 IEEE 754 浮点数,它是第一个(最接近于零)的整数,它不能被精确表示? 我现在只真正关心 32 位浮点数,尽管如果有人给出 64 位的答案,我会很感兴趣!
我认为这就像计算 2 bits_of_mantissa并加 1 一样简单,其中 bits_of_mantissa 是标准公开的位数。我在我的机器(MSVC++,Win64)上为 32 位浮点数做了这个,不过看起来还不错。
2 个尾数位 + 1 + 1
指数中的 +1(尾数位 + 1)是因为,如果尾数包含abcdef...它实际上表示的数字1.abcdef... 脳 2^e,则提供额外的隐含精度位。
abcdef...
1.abcdef... 脳 2^e
因此,第一个 不能 准确表示的整数将被四舍五入: 对于float, 16,777,217 (2 24 + 1)。 对于double, 9,007,199,254,740,993 (2 53 + 1)。
float
double
>>> 9007199254740993.0 9007199254740992