为了清晰起见,如果我正在使用实现IEE 754浮点数的语言,并且我声明:

float f0 = 0.f;
float f1 = 1.f;

...然后把它们打印出来,我将得到0.0000和1.0000 -完全正确。

但是IEEE 754不能表示实数线上的所有数字。接近零时,“差距”很小;距离越远,间隙越大。

所以,我的问题是:对于IEEE 754浮点数,哪一个是第一个(最接近零)不能精确表示的整数?我现在只真正关心32位浮点数,尽管我有兴趣听到64位的答案,如果有人给出它!

我认为这就像计算2bits_of_mantissa并加上1一样简单,其中bits_of_mantissa是标准暴露的比特数。我在我的机器(msvc++, Win64)上为32位浮点数做了这个操作,尽管它看起来很好。


当前回答

2mantissa位+ 1 + 1

指数中的+1(尾数位+1)是因为,如果尾数包含abcdef…它所代表的数字实际上是1.abcdef…× 2^e,提供了额外的隐式精度。

因此,第一个不能准确表示并将被四舍五入的整数是:

对于32位浮点数,16,777,217(224 + 1)。 对于64位浮点数,9007,199,254,740,993(253 + 1)。

下面是CPython 3.10中的一个例子,它使用64位浮点数:

>>> 9007199254740993.0
9007199254740992.0

其他回答

2mantissa位+ 1 + 1

指数中的+1(尾数位+1)是因为,如果尾数包含abcdef…它所代表的数字实际上是1.abcdef…× 2^e,提供了额外的隐式精度。

因此,第一个不能准确表示并将被四舍五入的整数是:

对于32位浮点数,16,777,217(224 + 1)。 对于64位浮点数,9007,199,254,740,993(253 + 1)。

下面是CPython 3.10中的一个例子,它使用64位浮点数:

>>> 9007199254740993.0
9007199254740992.0

一个n位整数所能表示的最大值是2n-1。如上所述,浮点数的有效位精度为24位,这似乎意味着224不适合。 然而。 在指数范围内2的幂可以精确地表示为1.0×2n,因此224可以适合,因此浮点数的第一个不可表示的整数是224+1。如上所述。一次。