#include <iostream>
#include <iomanip>

using namespace std;



double chord(double a, double b, double e, double (*f)(double))
{  // метод хорд

    double fa = f(a), fb = f(b);
    if (fa*fb > 0) throw runtime_error("Wrong data");

    for(;abs(b-a) > e;)
    {
        double x = a - (b-a)*fa/(fb-fa);
        b = a;
        fb = fa;
        a = x;
        fa = f(x);
    }
    return a;
}

double dichotomy(double a, double b, double e, double (*f)(double))
{ //метод дихотомии
    double fa = f(a), fb = f(b);
    if (fa*fb > 0) throw runtime_error("Wrong data");

    for(;abs(b - a) > e;)
    {
        double x = (a + b)/2;
        if (f(x)*fa > 0)  a = x;
        else              b = x;
    }
    return (a+b)/2;
}

double g(double x)
{
    return x * x * x - 18 * x - 83;
}

double f(double x)
{
    return x * x * x + 4 * x - 3;
}

int main()
{
    try {
        cout << chord(0,1,0.0001,f)  << "  vs  " << dichotomy(0,1,0.0001,f)  << "\n";
        cout << chord(2,10,0.0001,g) << "  vs  " << dichotomy(2,10,0.0001,g) << "\n";
    } catch(exception&e)
    {
        cerr << e.what() << endl;
    }
}
