有没有使用math.h和sqrt()获得数字的平方根的方法?

时间:2015-03-12 19:42:16

标签: c math

我已经为使用MPI执行Fox的Block Matrix Multiplication方法的类编写了一个程序。我能够通过使用sqrt()函数来实现这一点,但为了编译程序,我必须输入“mpicc -lm -o ...”。使用“mpicc -o ...”编译程序的hw状态的说明,没有-lm。我只是想知道是否有办法找到数字的平方根(无需编写单独的程序)。如果没有,我会将免责声明放在我的.txt文件顶部的评论中。认为这可能是一个值得问的好地方。谢谢!

5 个答案:

答案 0 :(得分:4)

计算1 / sqrt有一个旧的计算机图形技巧: (Quake III的原始代码)

    float Q_rsqrt( float number ) {
      long i;
      float x2, y;
      const float threehalfs = 1.5F;

      x2 = number * 0.5F;
      y  = number;
      i  = * ( long * ) &y;                       // evil floating point bit level hacking
      i  = 0x5f3759df - ( i >> 1 );               // what is this?
      y  = * ( float * ) &i;
      y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration
      //      y  = y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration, this can be removed
        return y;
    }

您可以阅读所有相关内容here

顺便说一句,我建议你只使用编译标志......

答案 1 :(得分:4)

此方法使用逐次逼近。它不需要很多次迭代。因为root的值可以抖动,所以我会检查收敛到一个小错误。

//#define MINDIFF 2.2250738585072014e-308   // smallest positive double
#define MINDIFF 2.25e-308                   // use for convergence check

double sqroot(double square)
{
    double root=square/3, last, diff=1;
    if (square <= 0) return 0;
    do {
        last = root;
        root = (root + square / root) / 2;
        diff = root - last;
    } while (diff > MINDIFF || diff < -MINDIFF);
    return root;
}

或者,您可以通过迭代固定次数来更简单地完成此操作

double sqroot(double square)
{
    double root=square/3;
    int i;
    if (square <= 0) return 0;
    for (i=0; i<32; i++)
        root = (root + square / root) / 2;
    return root;
}

答案 2 :(得分:2)

为此您可以阅读babylonian-method。然后借助这个定理你可以找到sqrt()

答案 3 :(得分:0)

此代码输出高达0.000001,因此请检查此信息。  该计划仅限于1到1050000000之间。

    {
        int x;
        printf ("Enter number : ");
        scanf ("%d",&x);
        int i=1,j=1;
        float x0=1.0;
        float xn=1.0;
        for(i=1,j=1;i<x;i=i*10,j++)
            if(x/i==0)
                i=x;
        i=i/10;
        j=j-1;
        if(j>1)
        x0=j*power(10,j/2);
        int a;
        for(a=1;a<=10;a++)
        {
            xn=0.5*(x0+(x/x0));
            x0=xn;
        }
        printf("\nSquare root of %d is  %f",x,xn);

    }
     int power(int x,int n)
    {
        int pow=1;
        int i;
        for(i=1;i<n;i++)
            pow=pow*x;
        return pow;
    }

答案 4 :(得分:0)

这是使用牛顿-拉夫森方法的平方根函数的实现。

基本思想是,如果y高估了非负实数x的平方根,则x/y将被低估,反之亦然,所以可以合理地预期这两个数字的平均值可以提供更好的近似值。

#define ABS(n) (((n) < 0) ? -(n) : (n)) /* Absolute function */
#define TOL 0.001 /* Tolerance */

float sqrt2(float x)
{
    float y = 1.0;
    while (ABS(x/y - y) > TOL )
    {
        y=(y+x/y)/2.0;
    }
    return y;
}