C GMP非整数权力

时间:2018-03-14 18:27:39

标签: c gmp

我正在使用C GMP库,我正在尝试计算一个浮点数,其mpf_t类型被提升到1.0 / n的幂,其中n是一个int。但是,这种类型的pow功能似乎只需要输入整数输入功率。这个库中是否有一个函数可以以双精度的形式执行,如果没有,是否可以使用快速算法?

1 个答案:

答案 0 :(得分:1)

  

这个库中是否有一个可以以形式执行权限的函数   双打,

没有。

  

如果没有,是否可以使用快速算法?

权力x 1.0/nn的方x根相同。还有一种有效的计算算法,请参阅:nth root algorithm - Wikipedia

这是可以轻松适应GMP的C代码。

功能:

void mpf_pow_ui (mpf_t rop, const mpf_t op1, unsigned long int op2);

- 将rop设置为op1,提升为op2,可用于代替dexp

#include <stdlib.h>
#include <stdio.h>

double dexp(double a, double toN){
    double ret = 1;

    for(int i = 0; i< toN; ++i)
        ret *= a;
    return ret;
}

double nth_root(double num, int N, double precision){
    double x;
    double dx;
    double eps = precision; 
    double A = num;
    double n = N;

    x = A * 0.5;

    dx = (A/dexp(x,n-1)-x)/n;

    while(dx >= eps || dx <= -eps){

        x = x + dx;
        dx = (A/dexp(x,n-1)-x)/n;
    }

   return x;
}

int main()
{
    int N = 4;
    int A = 81.0;

    double nthRootValue = nth_root(A, N, 10e-8);
    printf("Nth root is %lf", nthRootValue);

    return 0;
}

测试:

Nth root is 3.000000