C如何在双数据类型中存储1001位数?

use*_*166 4 c double

这是计算2的1000次幂的代码.

#include <stdio.h>

int main() {
    double multiply = 1;
    int i;
    for(i = 1; i <= 1000; i++) {
        multiply *= 2;
    }
    printf("%lf\n", multiply);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

和我的系统上的输出,以及ideone

10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376
Run Code Online (Sandbox Code Playgroud)

这是正确的答案:

irb(main):001:0> 10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376 == 2 ** 1000
=> true
Run Code Online (Sandbox Code Playgroud)

glg*_*lgl 15

根据IEEE 754,浮点数等以2幂格式存储:基数2的符号,尾数和指数.

因此,简单地说,2 ^ 1000存储有精确到1的尾数和1000的指数.

如果要添加2,则该值不再正确.

  • @ams:正常的64位IEEE-754二进制浮点数的指数范围是-1022到1023.还有一个隐含的前导1位.因此,如果要将浮点表示转换为二进制,则可能有53位,后跟最多971个零(不是2 ^ 10)或一个句点后跟最多1021(也不是2 ^ 10)个零后跟53位,或53位中间的句点. (2认同)