关于二分法方法(C ++)的错误答案

时间:2017-01-03 12:00:24

标签: c++

我正在解决典型的二分法方法任务,但具有固定容差(1e-20),固定间隔(0, 10)和给定函数:x^5 - a*x - 84422%100,其中用户输入a作为参数。

对于a = 5的示例,我应该在浮点后获得精确2.3227751229355622988位数的答案20,但我得到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 个答案:

答案 0 :(得分:1)

您的leftright是整数。

当你为他们分配mid时,你会丢失有效数字(所有这些都是虚拟的)。

将它们更改为double s。