有人能解释为什么GMP mpz_sizeinbase会返回1太大吗



我使用gmp库编写类似的C程序

len = mpz_sizeinbase(res, 10);

当res=9时,它给我2。所以我查看了手册,上面写着

size_t mpz_sizeinbase (mpz_t op, int base)

返回给定基数中以位数测量的操作大小。碱基可以在2到62之间变化。忽略op的符号,只使用绝对值。结果要么准确,要么1太大。如果基数是2的幂,则结果总是精确的。如果op为零,则返回值始终为1。

我只想知道为什么这个函数设计有这个漏洞?为什么不能准确?

我发现一些类似的问题:

GMP mpz_sizeinbase在基本10 中为9返回大小2

GMP整数的位数

mpz_sizeinbase不查看整个数字,只查看最高的单词。然后,它会估计大小。问题是,它可能看起来是999999999或1000000000。要想准确地知道这两个数字中的哪一个,必须查看数字的所有位。mpz_sizeinbase所做的是(例如使用单词==数字(计算9xxxxxxxx的大小。xxxxxxxx部分被忽略,可能导致第一个数字溢出。因此,大小增加了一并返回。

这可以让您分配足够的空间来快速转换数字,在某些情况下只需最少的浪费。另一种选择是转换整个数字以获得大小,分配缓冲区,然后重新进行操作以实际存储结果。

最新更新