C如何打印超大号?

ada*_*rsh 4 c linux windows gcc compilation

这段代码如何打印这么大的数字?我在Ubuntu 14.04(gcc 4.8.2)上尝试过它.它在任何编译器的MS Windows上都不起作用(即使是MinGW,也称为"gcc for Windows").为什么?

#include <stdio.h>
#include <math.h>
int main()
{
    printf("%.0f\n",pow(2,500));
}
Run Code Online (Sandbox Code Playgroud)

Ubuntu输出:

3273390607896141870013189696827599152216642046043064789483291368096133796404
674554883270092325904157150886684127560071009217256545885393053328527589376
Run Code Online (Sandbox Code Playgroud)

Windows输出:

3273390607896141900000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

(为了清晰起见,添加了换行符.)

chu*_*ica 7

正如OP提示并由@ user300234评论, 2^500是一个501位数,但这不是问题.

pow(2,500)返回a double,about 3.27e150,通常是binary64.此类型支持大约15-17个十进制数字的精度.因此,对于附近 的数字3.27e150,打印更多17位数的重要性通常并不重要.它比DBL_MAX可能的小得多1.798e308.

这里的技巧是pow(2,500)可以完全表示为浮点double(binary64).这可能会产生一种错觉,即它double具有数百位精度 - 但事实并非如此.

这两种不同的编辑double以不同的方式处理文本的转换,一旦打印了17个左右的数字 - 这是C规范允许的.正确数字的最小数量DBL_DECIMAL_DIG- 两个系统上可能为17.

考虑打印下一个更大的double.虽然下一个双打可以打印150个左右的数字,但通常这些额外的数字通过DBL_DECIMAL_DIG只是许多应用程序的噪音.

// 2 ^ 500
327339060789614 187001318969682759915221664...
// next
327339060789614 259685191399243448970154045...
Run Code Online (Sandbox Code Playgroud)

  • @specializt,我担心这不像你想的那样.即使您选择允许您仅使用n位表示2 ^ n的算法,要表示具有n位的无符号整数,您也只能表示0到2 ^ n-1之间的数字.当你使用n + 1位时,这超出了数字2 ^ n作为进入俱乐部的第一个候选者.如果您使用禁止使用0作为正确值的协议,那么您可以使用这些技巧,但这并不会使2 ^ n是n + 1个二进制数字的二进制数字. (6认同)
  • @specializt`2 ^ 3`是十进制的'8`或二进制的'1000`,它是4个二进制数字而不是3.`2 ^ 500`将需要501个二进制数字来表示. (5认同)