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生成并将其转换为整数,但是当有许多计算时,它会变慢。