C 以十进制形式打印大数字

C 以十进制形式打印大数字,c,algorithm,numbers,printf,gmp,C,Algorithm,Numbers,Printf,Gmp,虽然数字的表示在某种程度上是相对的,但我们 打印到外部世界时,通常使用十进制形式 我在MacOSX中,在分析libc的来源时,我发现 著名的printf函数最终调用了一个小函数\uuUltoa-after 经过vfprintf\u l,1104行\uu vfprintf,最后是\uuuuuuuUltoa。 它的定义如下(在本例中,所有这些都直接来自FreeBSD): 十进制形式的转换以简单的方式进行,除以 10和%10: do { *--cp = to_char(sval % 10);

虽然数字的表示在某种程度上是相对的,但我们 打印到外部世界时,通常使用十进制形式

我在MacOSX中,在分析libc的来源时,我发现 著名的
printf
函数最终调用了一个小函数
\uuUltoa
-after 经过
vfprintf\u l
,1104行
\uu vfprintf
,最后是
\uuuuuuuUltoa
。 它的定义如下(在本例中,所有这些都直接来自FreeBSD):

十进制形式的转换以简单的方式进行,除以 10和%10:

do {
    *--cp = to_char(sval % 10);
    sval /= 10;
} while (sval != 0);
然而,虽然这只适用于少量数字(最多8字节),但似乎太多了 对我来说是“体力劳动”。在GMP中,您可以轻松计算25000:

虽然它可以很容易地表示基数2或16,但十进制形式是 更难计算

那么,像GMP这样的库是如何处理这些问题的呢?看起来像是取模和 对于如此庞大的数字来说,划分成本可能会很高。有没有更快的算法,
还是我错了,标准过程对计算机来说很容易?

标准过程并不容易,但无论如何,你需要做等价的运算来获得十进制数字,这可能涉及到高精度的算术运算,即使二进制的原始值只是几位或一位。见我的问题:


这是关于浮点数的,但是所有大的浮点数都是整数,非常大和非常小的情况是唯一有趣的情况。

谢谢你,这真的很有帮助-我看到这门课有很多内容要读。然后我可能会准备好打印两个的幂,它代表了我们宇宙中原子的数量:——)
#define to_char(n)  ((n) + '0')
do {
    *--cp = to_char(sval % 10);
    sval /= 10;
} while (sval != 0);
mpz_t n;
mpz_init(n);
mpz_ui_pow_ui(n, 2ul, 5000ul);
gmp_printf("%Zd\n", n);