小编典典

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

all

为清楚起见,如果我使用的是实现 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 位浮点数做了这个,不过看起来还不错。


阅读 138

收藏
2022-07-08

共1个答案

小编典典

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
2022-07-08