2013-11-21 30 views
-6

以下內容在fpnewton行的int main部分返回的參數太少。 你能解釋一下嗎?有關過少的參數的錯誤

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
double f(double a, double b, double c, double x) 
{ 
    return pow(x,3)+a*pow(x,2)+b*x+c; 
} 

double fp(double a, double b, double c, double x) 
{ 
    return 3*pow(x,2)+(2*a*x)+b+0*c; 
} 

double newton(double a, double b, double c, double x) 
{ 
    return x - (f(a,b,c,x)/fp(a,b,c,x)); 
} 

int main() 
{ 
    double a,b,c,x1,x2; 
    int i; 
    char *input = getenv("QUERY_STRING"); 
    sscanf(input, "coeff1=%lf &coeff2=%lf &coeff3=%lf &x=%lf", &a, &b, &c, &x1); 
    if (fp(x1)==0.0) 
    { 
     printf("No convergence.\n"); 
     return 0; 
    } 
    for (i=0;i<100;i++) 
    { 
     x2=newton(x1); 
     if (fabs(x1-x2)<= pow(10,-10)) break; 
     x1=x2; 
    } 
    printf("iteration = %d\n", i); 
    printf("x= %lf\n", x1); 
    return 0; 
} 
+1

這看起來像C++ –

+3

@DavidPilkington當然看起來像C給我。 –

+0

我覺得它是C ...我在一個數值分析/編程類,我們在unix(基本系統命令)中輸入這些命令 – user3016224

回答

1

正是錯誤所說的!您還沒有通過足夠的參數:

這個原型:

fp(double a, double b, double c, double x) { 

意味着你需要傳遞四個參數,如:

fp(x1, what, about, these); 

這同樣適用於newton

另外,關於if (fp(x1)==0.0) - 雖然浮點零個值可以被相互比較(零是excatly零),請記住,計算機上的浮點是不精確。出於這個原因,你應該總是比較一些epsilon值:

#define EPSILON   0.0001  // salt to taste 
#define ABS(x)   (((x)<0) ? -(x) : x) 
#define FP_EQUALS(x,y) (ABS(x-y) < EPSILON) 

//if (d == 0.0) { 
if (FP_EQUALS(d, 0.0)) { 
    // d is "zero" 
} 

//if (a == b) { 
if (FP_EQUALS(a, b) { 
+0

非常感謝你!我的合作伙伴在同一時間發現了這一點(我們一直在盯着它一個多小時)。這個ε值是一個複雜的公式還是隻是一些接近0的計算數? – user3016224

+0

@ user3016224某些值接近零。這與你的程序在計算中應該允許的最大誤差有關。 –