在下面的代码中,我想将终止条件替换为:如果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;
}
答案 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的准确度相匹配,而不是平方值)。