有人可以解释为什么GMP mpz_sizeinbase将返回1太大吗?

时间:2018-12-10 08:53:12

标签: c gmp

我使用gmp库编写一个类似

的C程序
len = mpz_sizeinbase(res, 10);

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

    size_t mpz_sizeinbase (mpz_t op, int base)
  

返回给定基数中以位数表示的op的大小。 base可以从2到62不等。op的符号被忽略,仅使用绝对值。结果将是精确的或1个太大。如果以2为底的幂,则结果始终是准确的。如果op为零,则返回值始终为1。

我只想知道为什么此功能设计有这种泄漏?为什么不准确?

我发现类似的一些问题:

GMP mpz_sizeinbase returns size 2 for 9 in base 10

Number of digits of GMP integer

1 个答案:

答案 0 :(得分:2)

mpz_sizeinbase不会查看整数,而只会查看最高的单词。然后,它估计大小。问题在于,它可能正在查看999999999或1000000000。要确切知道这两个数字中的哪一个,必须要查看数字的所有位。 mpz_sizeinbase的作用是(以单词==数字为例)计算9xxxxxxxx的大小。 xxxxxxxx部分将被忽略,并可能导致第一位溢出。因此,将大小增加一并返回。

在某些情况下,您可以分配足够的空间来快速转换号码,而浪费最少。另一种方法是将整数转换为大小,分配缓冲区,然后重新进行一次以实际存储结果。