2011-04-30 83 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