这段代码怎么打印这么大的数字?我已经在 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));
}
Ubuntu 输出:
3273390607896141870013189696827599152216642046043064789483291368096133796404
674554883270092325904157150886684127560071009217256545885393053328527589376
Windows 输出:
3273390607896141900000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000
(添加换行符只是为了清楚起见。)
最佳答案
正如 OP 所暗示和@user300234 所评论的那样,2^500
是一个 501 位数,但这不是这里的问题。
pow(2,500)
返回一个 double
,大约是 3.27e150
,通常是 binary64 .此类型支持大约 15 - 17 位十进制数字的精度。因此对于 near 3.27e150
的数字,打印超过 17 位有效数字通常并不重要。它比 DBL_MAX
小得多,DBL_MAX
可能约为 1.798e308
。
这里的技巧是 pow(2,500)
完全可以表示为浮点 double
(binary64)。这可能给人一种错觉,即 double
具有数百位精度 - 但事实并非如此。
这 2 种不同的编译处理 double
到文本的转换以不同的方式进行,一旦打印了 17 位左右的数字 - 这是 C 规范所允许的。正确数字的最小数目是 DBL_DECIMAL_DIG
- 在两个系统上可能都是 17。
考虑打印下一个 更大的double
。尽管下一个 double 可以打印 150 位左右的数字,但通常这些额外的数字通过 DBL_DECIMAL_DIG
只是许多应用程序的噪音。
// 2 ^ 500
327339060789614 187001318969682759915221664...
// next
327339060789614 259685191399243448970154045...
关于c - C如何打印一个超大数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28000923/