2012-03-04 13 views
2

私は、その3次関数の根を見つけるために3次関数の2分法を使うプログラムをC++で作成しようとしています。今私はこれを持っている:C++での二分法

#include <iostream> 
#include <cmath> 

using namespace std; 

int functie(double a,double b,double c,double d,double x){ 
    double y; 
    y = (a*x*x*x + b*x*x + c*x + d); 
    return y; 
} 

int main(){ 

    int a,b,c,d;//no comment 

    cout << "enter of form: ax^3 + bx^2 + cx + d (integers)" << endl << "a: "; 
    cin >> a; 
    cout << endl << "b: "; 
    cin >> b; 
    cout << endl << "c: "; 
    cin >> c; 
    cout << endl << "d: "; 
    cin >> d; 

    double min, max, temp; 

    min = -100; 
    max = 108.54267542; 
    while(functie(a,b,c,d,max) == 0 ||functie(a,b,c,d,min) == 0){ 
    temp = (max + min)/2; 
    if(functie(a,b,c,d,min) < 0 && functie(a,b,c,d,temp) < 0 || functie(a,b,c,d,min) > 0 && functie(a,b,c,d,temp) > 0){ 
      min = temp; 
    } else {max = temp;} 
    } 
    cout << min << endl; 
    cout << max << endl; 
    cout << temp << endl; 
    system("pause"); 
    return 0; 
} 

しかし、それは動作しません。プログラムの最後にあるcoutは入力値のみを出力します。 (私の最大値がどうしてこんなに奇妙なのか疑問がある場合、最大値が+100でルートが0の場合、プログラムがクラッシュするのを防ぐためです...)

いくつかの時間とこれをチェックしたい、ありがとう。

+3

チェックを外す:検査でエラーを見つけ出すことは生産的ではありません。 –

+0

ところで、あなたはクローズの投票をどうやって行うのですか(私はこの特定の質問に投票すると言っているわけではありません)。 –

+0

@BorisStrandjevあなたはあなたのコードをデバッガでステップ実行したり、 –

答えて

2

もちろん間違っています。この行に:functieから返された値がゼロである場合にのみ

while(functie(a,b,c,d,max) == 0 ||functie(a,b,c,d,min) == 0) 

ループが実行されます。 maxminの値は決して変更しないでください。

そして、あなたはこのようなfunctieを宣言している:

int functie(double a,double b,double c,double d,double x) 

あなたが戻っている(そして、あなたがしなければならない)functieから、しかしのでそれはintにキャストの定義のdouble値。あなたはする必要が

while(functie(a,b,c,d,max) == 0 ||functie(a,b,c,d,min) == 0) 

+1

あなたの意見は正しいですが、 「これは何?」のような言葉を追加するには少し厳しいです。 –

+0

Oh my神!何を私はそこでやったのですか?それは、私の中で!=を述べるべきです。もちろん、その機能は二重でなければなりません... :( – vrwim

+0

@BorisStrandjev:) – 0605002

1

あなたのプログラムのいくつかのコメント:

あなたのfunctie機能でダブルを返すべきである:

double functie(double a,double b,double c,double d,double x){ 
    return (a*x*x*x + b*x*x + c*x + d); 
} 

FlopCoderは、このチェックを指摘したようには正しくありません。彼らはルートポイントではないことを確認し、2つのいずれかがではないことを確認してください。しかし、私はそれをもう少し修正するつもりです。なぜなら、倍精度と比べると小さな特異性があるからです。

double epsilon = 1e-10; 
while(fabs(functie(a,b,c,d,max)) > epsilon 
     && fabs(functie(a,b,c,d,min)) > epsilon){ 

私は1つの非常に小さい、まだゼロではない定数と比較することに注意してください。ダブルスはゼロになることはありません。絶対に値が得られるのは、どちらの側でもゼロに十分近いかどうかをチェックする必要があるからです。