2011-04-30 68 views
0

我寫了下面的代碼,用牛頓法通過逐次逼近找到平方根,但它沒有給我正確的答案。可以請某人解釋它嗎?牛頓法求平方根的邏輯有什麼問題?

#include<stdio.h> 
#include<stdlib.h> 
#define square(x) x*x 
double rootByNewtonApprox(int n); 
double improve(double n); 
double average(double a,double b); 
int goodEnough(double guess); 
double guess(int n); 
int number; 
int main(void) 
{ 

    double root; 
    printf("\nEnter the number you want square root of: "); 
    scanf("%d",&number); 
    if(number<0) 
      number = -1* number; 
    root = rootByNewtonApprox(number); 
    printf("\nThe square root of %d is %lf\n",number,root); 
    return 0; 
} 
double guess(int n) 
{ 
    return n/2; 
} 
double rootByNewtonApprox(int n) 
{ 
    if(goodEnough(guess(n))) 
      return guess(n); 
    else 
      rootByNewtonApprox(improve(guess(n))); 
} 

double improve(double guess) 
{ 
    return average(guess,(number/guess)); 
} 
double average(double a,double b) 
{ 
    return ((a+b)/2); 
} 
int goodEnough(double guess) 
{ 
    if(abs(square(guess) - number) <= 0.001) 
      return 1; 
    else 
      return 0; 
} 

現在,當我給n = 2它給人的輸出中nan,當我給n = 9它告訴segmentation Fault

+0

見@ J.S。泰勒的回答如下代碼。你遇到的是整數除法(不允許餘數),所以你的一些函數沒有返回正確的浮點值。 – 2011-04-30 06:19:14

回答

7
double guess(int n) 
{ 
    return n/(double) 2; 
} 
+0

或者將'n'投射到雙倍工作。 – 2011-04-30 06:17:38

+1

或者除以2.0而不是2. – 2011-04-30 06:19:50

3

你忘了一個return

double rootByNewtonApprox(int n) 
{ 
if(goodEnough(guess(n))) 
    return guess(n); 
else 
    return rootByNewtonApprox(improve(guess(n))); 
    ^
} 
+0

先生,在完成上述所有變更後,仍然不會輸出「分段故障」盯着我的臉! – station 2011-04-30 07:05:33

+0

我看到沒有理由重複什麼J.S.泰勒指出。所以我把這個原因加到了第二個問題上 - 'n = 2'返回nan。 – MByD 2011-05-01 05:57:47