私は典型的な二分法のタスクを解決しますが、固定の許容値(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;
}
あなたは倍数で20桁の有効数字を得ることはできません(例:[ここ](http://stackoverflow.com/questions/13542944/how-many-significant-digits-have-floats-and-doubles-in-java) ) – user463035818
@tambre 64ビットの倍精度は、それがC++ではないので、より重要な数字を持っていません – user463035818