首页 > 解决方案 > 有人可以解释为什么 GMP mpz_sizeinbase 会返回 1 太大吗?

问题描述

我使用 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 太大。如果 base 是 2 的幂,则结果总是准确的。如果 op 为零,则返回值始终为 1。

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

我发现了一些类似的问题:

GMP mpz_sizeinbase 以 10 为底返回 9 的大小 2

GMP整数位数

标签: cgmp

解决方案


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

这使您可以分配足够的空间来快速转换数字,在某些情况下只会产生最小的浪费。另一种方法是转换整数以获得大小,分配缓冲区,然后重新执行以实际存储结果。


推荐阅读