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

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

# include float absolute(float x) { if (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; } 

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

  while ( absoluteValue((guess * guess) / x - 1.0) >= 0.0001 ) 
 # include 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; } 

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

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

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

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

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

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

至少它适用于任何IEEE754兼容的实现,不会出现溢出或下溢。

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