c - C如何打印一个超大数?

标签 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));
}

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/

相关文章:

c - 多线程 - 使用线程执行将文件内容存储在 char **array 中的函数?

linux - 使用安装命令时如何正确重定向 bash 脚本执行输出

linux - 如何计算linux中的百分比

c++ - 为什么在 Ubuntu 18.04.1 的 netinet 中没有定义 in_addr6?

Python 解释器在 Powershell ISE 中崩溃

C - 将用户生成的数字转换为单词的问题

c - 广度优先

c - 找不到 emmake 和 emconfigure 命令 (osx)

python - 如何在 Windows 的命令提示符中获取 python?

第三方应用程序的 Windows 集中配置?