IEEE 754浮点数不能精确表示的第一个整数是哪一个?

为了清晰起见,如果我正在使用实现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位浮点数做了这个操作,尽管它看起来很好。

50290 次浏览

2__abc0 + 1

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

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

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

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

>>> 9007199254740993.0
9007199254740992.0
n位整数可表示的最大值为2n-1。如上所述,float的有效位精度为24位,这似乎意味着224不适合。

然而。< br >
在指数范围内2的幂可以精确地表示为1.0×2<我> n < / i >,因此224 可以适合,因此float的第一个不可表示的整数是224+1。如上所述。一次。< / p >