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)
(为了清晰起见,添加了换行符.)
正如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)