我正在使用GMP和MPFR库处理大数,我需要快速计算一个数的幂。增强的结果将始终是整数,但效力可以是浮点数也可以不是浮点数。GMP库计算幂非常快,但不接受浮点幂(使用mpz_pow_ui函数),MPFR库接受浮点幂,但速度非常慢,因为它需要高精度才能正确计算整数(使用mpfr_pow函数)。对此有什么解决方案吗?GMP如何接受浮点幂,或者MPFR如何快速(且正确地)计算整数?
//Ex:
mpz_pow_ui(mpz_power, base, 4790) //Fast
// power = 4790.60
mpfr_pow(mpfr_power, base, power, MPFR_RNDN) //Slow发布于 2021-12-21 00:03:22
这完全取决于你要计算的数字的量级。下面假设基数和指数都是非复数的正数。
首先请注意,整数b与十进制数4790.60的幂可以像这样重写(真不敢相信,我不能用StackOverflow编写Latex风格的数学方程):
b ^ 4790.60 = b ^ (4790 + 0.60) = (b ^ 4790) * (b ^ 0.60)然后,可以清楚地使用GMP计算第一项(b ^ 4790)并得到整数值。
第二项的指数小于1,因此它的值将小于b。如果b不是一个大整数(例如,双精度浮点值可以连续表示的最大整数<< FLINTMAX是2^53 ),那么您可以使用原生的double pow函数来计算它,并将其安全地舍入为所需的整数,然后乘以第一项。如果b是一个巨大的整数,你有太多的选择:如果它在双精度范围内,你有太多的选择:如果它在双精度范围内,那么你可以使用double pow函数(也许在得到的具有速度增益的整数中失去一些精度),或者你可以使用mpfr_pow函数来计算这个第二项,但注意它将是一个比b更小的数字,所以你可以在计算中根据指数b调整b的精度:如果b更接近于零,请使用小精度。如果b接近于1,请使用不太小于b的精度。
最后,考虑到您所受的机器资源限制,所有这些都是精度和速度之间的权衡。
https://stackoverflow.com/questions/60583885
复制相似问题