使用Newton-Raphson方法在C中的平方根

时间:2012-12-26 09:23:37

标签: c square-root

在下面的代码中,我想将终止条件替换为:如果guess square和x的比率接近1,则loop应该终止。我尝试了各种表达式,但都没有正确运行代码。有什么建议吗?

# include<stdio.h>
float absolute(float x)
{
     if (x < 0)
         x = -x;
     return x;
}

float square(float x)
{
    float guess = 1;

    while(absolute(guess*guess - x) >= 0.0001 )
        guess = ((x/guess) + guess) / 2;

    return guess;
}

int main(void)
{
    printf("square root of 2 is %f\n", square(2));
    printf("square root of 3 is %f\n", square(3));
    return 0;
}

4 个答案:

答案 0 :(得分:3)

点击答案:while语句应该是这样的:

 while  ( absoluteValue((guess * guess) / x  - 1.0) >= 0.0001 ) 

答案 1 :(得分:2)

# include<stdio.h>

double sq_root(double x)
{
    double rt = 1, ort = 0;
    while(ort!=rt)
    {
        ort = rt;
        rt = ((x/rt) + rt) / 2;
    }
    return rt;
}

int main(void)
{
    int i;
    for(i = 2; i<1001; i++) printf("square root of %d is %f\n",i, sq_root(i));
    return 0;
}

答案 2 :(得分:1)

  

如果猜测平方与x的比率接近1

那你为什么减去?使用比率运算符:

while(absolute( (guess*guess) / x - 1) >= 0.0001 )

答案 3 :(得分:1)

你可能无法达到那个猜测*猜测就足够接近x了;想象一下2e38的sqrt - 每个近似值都不会小于〜1e31,你的退出条件将不会成功。

适用于所有情况的变体是当猜测停止变化时停止此方法。所以你会写类似

的东西
prev_guess = 0; // any initial value is ok
while (guess != prev_guess) {
    ...
    prev_guess = guess;
}

至少它适用于任何未达到溢出或下溢的IEEE754兼容实现。

你也可以比较一下guess和prev_guess的差异(一旦目标通常与root的准确度相匹配,而不是平方值)。