为了清晰起见,如果我正在使用实现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