是否有任何 64 位无符号整数值不能用双精度浮点类型表示?(因为双精度也是 64 位宽,所以肯定有一些。)如果是这样,我如何计算所有这些?(以一种不蛮力的方式,也许?)
3 回答
IEEE754 双精度值有 53 位有效位,因此任何具有超过 53 个连续有效位(即前 1 位到最后 1 位的距离超过 53 位)的 64 位无符号整数都不能无损转换为双倍。
从 0 到 2^52(含)的每个整数都可以精确表示,从 2^52 到 2^53,只有每个偶数整数(0 的最低有效位),然后是每四个整数,直到 2^64-2^12。
我们可以用一些代码来概括,
采取 m=52 :
for (i=0; i<(64-m+1); i++) {
start = i ? 1ULL << (i+m) : 0;
end = ((1ULL << m+1)-1) << i;
step = 1ULL << i;
}
产生:
0000000000000000 to 001fffffffffffff step 1
0020000000000000 to 003ffffffffffffe step 2
0040000000000000 to 007ffffffffffffc step 4
0080000000000000 to 00fffffffffffff8 step 8
0100000000000000 to 01fffffffffffff0 step 16
0200000000000000 to 03ffffffffffffe0 step 32
0400000000000000 to 07ffffffffffffc0 step 64
0800000000000000 to 0fffffffffffff80 step 128
1000000000000000 to 1fffffffffffff00 step 256
2000000000000000 to 3ffffffffffffe00 step 512
4000000000000000 to 7ffffffffffffc00 step 1024
8000000000000000 to fffffffffffff800 step 2048
例子 :
将 0x0020000000000000 分配给双精度会得到 9007199254740992.0(IEEE754 中的 0x0x4340000000000000)
将 0x0020000000000001 分配给双精度数给出 9007199254740992.0 (相同的值)
将 0x0020000000000002 分配给双精度数给出 9007199254740994.0 (0x0x4340000000000001 ,这是下一个可表示的值)
如果一个 64 位数字表示如下:
52 个 A 位,后跟至少 1 个 B 位,然后是单个“1”位。
其中 A 是任何位,并且 B 位中的一个必须非零,则它不能表示为双精度位。(我依赖于位用于双精度的方式,如http://en.wikipedia.org/wiki/Double-precision_floating-point_format所示)