首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >快速计算数字的幂(MPFR库)

快速计算数字的幂(MPFR库)
EN

Stack Overflow用户
提问于 2020-03-08 10:01:18
回答 1查看 208关注 0票数 0

我正在使用GMPMPFR库处理大数,我需要快速计算一个数的幂。增强的结果将始终是整数,但效力可以是浮点数也可以不是浮点数。GMP库计算幂非常快,但不接受浮点幂(使用mpz_pow_ui函数),MPFR库接受浮点幂,但速度非常慢,因为它需要高精度才能正确计算整数(使用mpfr_pow函数)。对此有什么解决方案吗?GMP如何接受浮点幂,或者MPFR如何快速(且正确地)计算整数?

代码语言:javascript
运行
复制
//Ex:

mpz_pow_ui(mpz_power, base, 4790)  //Fast

// power = 4790.60
mpfr_pow(mpfr_power, base, power, MPFR_RNDN)  //Slow
EN

回答 1

Stack Overflow用户

发布于 2021-12-21 00:03:22

这完全取决于你要计算的数字的量级。下面假设基数和指数都是非复数的正数。

首先请注意,整数b与十进制数4790.60的幂可以像这样重写(真不敢相信,我不能用StackOverflow编写Latex风格的数学方程):

代码语言:javascript
运行
复制
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的精度。

最后,考虑到您所受的机器资源限制,所有这些都是精度和速度之间的权衡。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60583885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档