C 以十进制形式打印大数字
虽然数字的表示在某种程度上是相对的,但我们 打印到外部世界时,通常使用十进制形式 我在MacOSX中,在分析libc的来源时,我发现 著名的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);
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);