【发布时间】:2013-07-20 21:12:55
【问题描述】:
是否存在不能用双精度浮点类型表示的 64 位无符号整数值? (因为双精度也是 64 位宽,所以肯定有一些。)如果是这样,我如何计算它们的 all? (也许不是蛮力的方式?)
【问题讨论】:
标签: 64-bit double numeric unsigned-integer
是否存在不能用双精度浮点类型表示的 64 位无符号整数值? (因为双精度也是 64 位宽,所以肯定有一些。)如果是这样,我如何计算它们的 all? (也许不是蛮力的方式?)
【问题讨论】:
标签: 64-bit double numeric unsigned-integer
如果一个 64 位数字表示如下:
52 个 A 位,后跟至少 1 个 B 位,后跟一个“1”位。
其中 A 是任意位,并且 B 位中的一个必须非零,则它不能表示为双精度。 (我是依赖位用于double的方式,如http://en.wikipedia.org/wiki/Double-precision_floating-point_format所示)
【讨论】:
从 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,这是下一个可表示的值)
【讨论】:
一个 IEEE754 双精度值有 53 位有效位,因此任何具有超过 53 个连续有效位的 64 位无符号整数(即前 1 位到最后 1 位之间的距离长度超过 53 位) ) 不能无损转换为双精度。
【讨论】: