为清楚起见,如果我使用的是实现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位浮点数做了这个,但它看起来很好.
一个double(给定数量的字节,具有合理的尾数/指数平衡)是否总能完全精确地保持无符号整数的范围是该字节数的一半?
例如,8字节双精度可以完全精确地保持四字节无符号整数的范围吗?
这将归结为如果两个字节的浮点数可以保持一个字节无符号整数的范围.
一个字节的无符号int当然是0 - > 255.
什么是(连续的)整数的确切范围,可以表示为double(resp.浮点?)我问的原因是因为我对这样的问题感到好奇,因为会发生精度损失.
那是
m,m+1不能精确表示为double(resp.浮点数)?-n,-n-1不能精确表示为double(resp.浮点数)?(可能与上面相同).这意味着,每一个之间的整数-n和m具有精确的浮点表示.我基本上都在寻找[-n, m]浮动和双打的范围.
我们将范围限制为标准IEEE 754 32位和64位浮点表示.我知道浮点数有24位精度,双精度数有53位(都带有隐藏的前导位),但由于浮点表示的复杂性,我正在寻找权威的答案.请不要挥手!
(理想的答案将证明,所有的整数从0到m的表达,这m+1是没有的.)