2017-01-03 9 views
1

私は典型的な二分法のタスクを解決しますが、固定の許容値(1e-20)、固定間隔(0, 10)と与えられた関数:x^5 - a*x - 84422%100、ここでユーザーはaをパラメータとして入力します。二分法のプログラム(C++)で間違った答え

a = 5の例では、浮動小数点の後に精度20桁の答えが2.3227751229355622988になるはずですが、2.50000000000000000000が得られます。どこが間違ってここにいる私のコードです:

#include <iostream> 
#include <iomanip> 
#include <cmath> 
using namespace std; 

const double e = 1e-20; 
const int fn = 84422; 

double f(int a, int x) 
{ 
    double y = x * x * x * x * x - a * x - fn % 100; 
    return (double)y; 
} 

int main() 
{ 
    double lv, rv, midv, mid, root, tol; 

    int left = 0; 
    int right = 10; 
    int a; 
    cin >> a; 

    do 
    { 
     mid = (left + right)/2.0; 
     rv = f(a, right); 
     lv = f(a, left); 
     midv = f(a, mid); 

     if(midv == 0) 
     { 
      root = mid; 
      break; 
     } 

     if(midv * lv < 0) 
     { 
      right = mid; 
     } 
     else 
      left = mid; 
    } while ((right - left) > e); 

    root = (left + right)/2.0; 
    cout << " The Root is approximately: "; 
    cout << fixed << setprecision(20) << root << endl; 

    cin.get(); 
    cin.get(); 
    return 0; 
    } 
+1

あなたは倍数で20桁の有効数字を得ることはできません(例:[ここ](http://stackoverflow.com/questions/13542944/how-many-significant-digits-have-floats-and-doubles-in-java) ) – user463035818

+4

@tambre 64ビットの倍精度は、それがC++ではないので、より重要な数字を持っていません – user463035818

答えて

1

あなたleftrightは整数です。

midを割り当てると、有効数字が失われます(すべて実質的に)。

doubleに変更します。

+0

私はそれらを倍精度で修正してもまだ動作しません。同じ結果が得られます –

+2

@KristianKamenov - 'f'は' int'sを受け取ります同じように。アルゴリズムのすべての整数は、実際にプリフォームする計算を切り捨てます。 – StoryTeller

+0

2倍にすべてを固定し、今私は答えを得ました2.0000000000000000000 –

関連する問題