有人可以解释为什么 GMP mpz_sizeinbase 会 return 1 太大吗?
Can some one explain why GMP mpz_sizeinbase will return 1 too big?
我使用 gmp 库编写一个 C 程序,如
len = mpz_sizeinbase(res, 10);
当 res = 9 时,它给了我 2。所以我查看手册,它说
size_t mpz_sizeinbase (mpz_t op, int base)
Return the size of op measured in number of digits in the given base. base can vary from 2 to 62. The sign of op is ignored, just the absolute value is used. The result will be either exact or 1 too big. If base is a power of 2, the result is always exact. If op is zero the return value is always 1.
我只想知道为什么这个功能设计有这个漏洞?为什么不能准确?
我发现了一些类似的问题:
Number of digits of GMP integer
mpz_sizeinbase不看整数,只看最高字。然后它估计大小。问题是它可能正在查看 999999999 或 1000000000。要确切知道这两个中的哪一个是数字的所有位,则必须查看。 mpz_sizeinbase 所做的是(使用 word == digit 作为示例)计算 9xxxxxxxx 的大小。 xxxxxxxx 部分被忽略,可能导致第一个数字溢出。所以大小加一返回。
这让您可以分配足够的 space 来快速转换数字,在某些情况下只会产生最少的浪费。另一种方法是转换整数以获得大小,分配缓冲区,然后重新执行以实际存储结果。
我使用 gmp 库编写一个 C 程序,如
len = mpz_sizeinbase(res, 10);
当 res = 9 时,它给了我 2。所以我查看手册,它说
size_t mpz_sizeinbase (mpz_t op, int base)
Return the size of op measured in number of digits in the given base. base can vary from 2 to 62. The sign of op is ignored, just the absolute value is used. The result will be either exact or 1 too big. If base is a power of 2, the result is always exact. If op is zero the return value is always 1.
我只想知道为什么这个功能设计有这个漏洞?为什么不能准确?
我发现了一些类似的问题:
Number of digits of GMP integer
mpz_sizeinbase不看整数,只看最高字。然后它估计大小。问题是它可能正在查看 999999999 或 1000000000。要确切知道这两个中的哪一个是数字的所有位,则必须查看。 mpz_sizeinbase 所做的是(使用 word == digit 作为示例)计算 9xxxxxxxx 的大小。 xxxxxxxx 部分被忽略,可能导致第一个数字溢出。所以大小加一返回。
这让您可以分配足够的 space 来快速转换数字,在某些情况下只会产生最少的浪费。另一种方法是转换整数以获得大小,分配缓冲区,然后重新执行以实际存储结果。