1

在下面的代码中,我想将终止条件替换为:如果猜测平方和 x 的比率接近 1,则 while 循环应该终止。我尝试了各种表达式,但没有一个能正确运行代码。有什么建议吗?

# 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

4 回答 4

3

找到答案:while 语句应该是这样的:

 while  ( absoluteValue((guess * guess) / x  - 1.0) >= 0.0001 ) 
于 2012-12-26T09:38:16.543 回答
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;
}
于 2013-06-22T05:29:30.757 回答
1

如果猜测平方和 x 的比值接近 1

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

while(absolute( (guess*guess) / x - 1) >= 0.0001 )
于 2012-12-26T09:28:04.960 回答
1

您可能无法达到猜测*猜测足够接近 x;想象一下,例如 2e38 的 sqrt - 每个近似值都不会比 ~1e31 更近,并且您的退出条件永远不会成功。

适用于所有情况的变体是,当猜测停止改变时,会发生这种方法的停止。所以你会写类似

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

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

您也可以比较guess 和 prev_guess 的差异(只要目标通常是匹配足够的根精度,而不是平方的值)。

于 2013-06-22T10:29:38.883 回答