#include #include using namespace std; enum state { ITERATING, SUCCESS, WONTSTOP, NEARZERO, SAMESIGN }; typedef double (*func)(double); state interval(func, double, double, double&, int&); state regfalsi(func, double, double, double&); const double delta = 5.0E-7; const double eps = 5.0E-8; const int maxiter = 100; state interval(func f, double a, double b, double &x, int &iter) { if (fabs(a - b) < delta) return SUCCESS; if (++iter == maxiter) return WONTSTOP; x = a - f(a)*(b - a)/(f(b) - f(a)); if (fabs(f(x)) < eps) return SUCCESS; cout << iter << "\t" << a << "\t" << b << "\t" << x << "\n"; f(x)*f(a) > 0 ? a = x: b = x; return interval(f, a, b, x, iter); } state regfalsi(func f, double a, double b, double &x) { if (f(a)*f(b) > 0) return SAMESIGN; int iter = 0; return interval(f, a, b, x, iter); } inline double F(double x) { return x - exp(-x);} main() { double a, b, root; cout << "lower estimate = "; cin >> a; cout << "upper estimate = "; cin >> b; state s = regfalsi(F, a, b, root); switch(s){ case SUCCESS: cout << "root = " << root << "\n"; break; case WONTSTOP: cout << "not convergent!\n"; break; case SAMESIGN: cout << "unsuitable interval!\n"; break; default: cout << "that's very peculiar!\n"; break; } }