193

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

4

2 回答 2

247

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
于 2010-09-25T13:14:50.267 回答
46

n位整数可表示的最大值为2 n -1。如上所述, afloat的有效位精度为 24 位,这似乎暗示 2 24不适合。

然而

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

于 2014-04-12T13:51:02.950 回答