64位无符号整数,无法映射到double

时间:2013-07-22 07:50:57

标签: 64-bit double numeric unsigned-integer

是否有任何64位无符号整数值无法用双精度浮点类型表示? (由于双倍也是64位宽,必须有一些。)如果是这样,我怎么能计算所有呢? (可能用非暴力的方式?)

3 个答案:

答案 0 :(得分:2)

IEEE754双精度值具有53位有效位数,因此任何具有超过53个连续有效位的64位无符号整数(即前1位到最后1位之间的距离长度超过53位) )不能无损地转换为双倍。

答案 1 :(得分:1)

从0到2 ^ 52(包括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分配给double给出9007199254740992.0(IEEE754中为0x0x4340000000000000)

将0x0020000000000001分配给double给出9007199254740992.0(相同值)

将0x0020000000000002分配给double给出9007199254740994.0(0x0x4340000000000001,这是下一个可表示的值)

答案 2 :(得分:0)

如果64位数字表示如下:

52 A位,后跟至少1 B位,后跟一个“1”位。

其中A是任意位,其中一个B位必须为非零,则它不能表示为double。 (我依赖于比特用于双倍的方式,如http://en.wikipedia.org/wiki/Double-precision_floating-point_format

所示