2012-12-26 43 views
1

在下面的代碼中,我想將終止條件替換爲:如果猜測square和x的比值接近1,while循環應該終止。我嘗試了各種表達式,但沒有正確運行代碼。任何建議?使用Newton-Raphson方法的C中的平方根

# 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; 
} 
+1

不要重新發明輪子。 ''中有'fabsf()'函數。 – 2012-12-26 09:30:14

+0

@ H2CO3在''中也有'std :: abs'。 – rubenvb

+2

@rubenvb問題標籤爲C. –

回答

3

打了答案:while語句應該是這樣的:

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

如果猜測廣場和x的比例接近1

那你爲什麼減法?使用比率運算:

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

你的建議讓我進入了無限!它沒有工作.. – user1825355

+1

不應該是fabs(guess * guess/x - 1)> = 0.0001'? – Kotte

+0

@Kotte:是的,這發生在競賽後發佈答案。 – Azodious

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; 
} 
1

這是可能的,你不能達到這個猜測*猜測將是足夠接近X;想象如2e38的sqrt - 每個近似都不會比〜1e31更近,並且您的退出條件不會成功。

適用於所有情況的變體適用於在猜測停止更改時停止此方法。所以你會寫如

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

至少它應該適用於任何IEEE754兼容的實現沒有達到溢出或下溢。

此外,您可以比較猜測和prev_guess的差異(只要目標通常足以匹配根的準確度,而不是平方值)。