C 快速计算数字的幂(MPFR库)
我正在使用C 快速计算数字的幂(MPFR库),c,gmp,bignum,mpfr,C,Gmp,Bignum,Mpfr,我正在使用GMP和MPFR库处理大数,我需要快速计算一个数的幂。增强的结果将始终是一个整数,但效力可能是一个浮点数,也可能不是。GMP库计算幂非常快,但不接受浮点幂(使用mpz\u pow\u ui函数),MPFR库接受浮点幂,但速度非常慢,因为正确计算整数需要高精度(使用函数MPFR\u pow)。 有什么解决办法吗?GMP如何快速(正确)计算整数 //例: mpz_-pow_-ui(mpz_-power,base,4790)//快速 //功率=4790.60 mpfr\u pow(mpfr
GMP
和MPFR
库处理大数,我需要快速计算一个数的幂。增强的结果将始终是一个整数,但效力可能是一个浮点数,也可能不是。GMP
库计算幂非常快,但不接受浮点幂(使用mpz\u pow\u ui
函数),MPFR
库接受浮点幂,但速度非常慢,因为正确计算整数需要高精度(使用函数MPFR\u pow
)。
有什么解决办法吗?GMP
如何快速(正确)计算整数
//例:
mpz_-pow_-ui(mpz_-power,base,4790)//快速
//功率=4790.60
mpfr\u pow(mpfr\u power,base,power,mpfr\u RNDN)//慢
由于计算可以通过乘法完成,因此mpz_pow_ui
函数速度很快。请注意,如果不需要精确的整数结果(如果指数较大,则结果会很大),则使用mpfr\u pow\u ui
和mpfr\u RNDN
应该会更快,因为乘法可以以较小的精度完成并四舍五入
除非指数不是太大的整数,mpfr\u pow
将较慢,因为它需要计算对数和指数,这比乘法更复杂。我不认为你可以避免它,即使你知道结果是一个整数。但是如果你知道结果是一个整数,你可以用小于1/2的误差来计算它。因此,通过错误分析,您可以降低输入和输出变量的精度,从而使mpfr\u pow
更快
注意:你是说
MPFR
库接受浮点幂,但速度非常慢,因为它需要高精度才能正确计算整数(使用函数MPFR\u pow
)
事实并非如此。MPFR将仔细选择中间精度,以提供所需精度的答案(尽管有时可能会做出错误的选择)
但是,如果精确结果非常接近“机器编号”,则可能会出现问题,因为MPFR需要返回错误符号(忠实取整
MPFR\u RNDF
,而不是MPFR\u RNDN
,可能会有所帮助,但尚未针对MPFR\u pow
)进行优化:将出现制表商的困境,需要更高精度的内部计算。但是,如果您仔细选择了输入的精度,在您的案例中就不太可能出现这种情况;事实上,降低输入的精度往往会给精确结果增加一些误差,这会使精确结果偏离预期的整数(精确结果是指具有近似输入的精确结果)。你也可以使用一些技巧。例如,如果你知道你的整数不是一个完美的平方,那么你可以计算xy/2(它与机器编号不对应,因此由于制表商的困境不应该有问题),然后将结果平方。这是我的错误,我键入了一个随机数作为示例,但我现在要编辑,对不起。当功率为4790.60时,mpfr\u-pow(mpfr\u-power,base,power,mpfr\u-RNDN)
的结果是整数,您如何计算?除非基数是整数的五次幂,否则不能为。是吗?mpfr\u pow
永远不会返回一个精确的整数值,我的观点是我只需要整数值,但由于库以浮点数精度工作,它将花费比GMP
更长的时间。但是我不能使用GMP
,因为它不接受波动值的幂。所以“增强的结果将始终是整数”不是真的,幂运算的结果将是一些非整数,但你想要一些整数结果吗?地板、天花板还是最接近的整数?你能就目前的情况说点别的吗?为什么要从非整数结果中选择整数?你在做任何形式的模运算吗?如果我想通过计算10
的幂来生成数字1000
,只要做10^3
,对吗?但是如果我想用10
的幂生成数字900怎么办?我知道10^2
是100
和10^3
是1000
,要生成数字900
,我需要一个介于2
和3
之间的浮点数。但是运算的结果不会是一个精确的整数,但它只是我在计算中需要的精确整数,我可以使用MPFR生成并将其转换为整数,但是当有许多计算时,它会变慢。