#include #include using namespace std; enum state { ITERATING, SUCCESS, WONTSTOP, NEARZERO, SAMESIGN }; typedef double (*func)(double); state newton(func, func, double&); const double toosmall = 5.0E-30; const double delta = 5.0E-7; const double eps = 5.0E-8; const int maxiter = 100; state newton(func f, func f1, double &x) //f1 = f'(x) { int iter = 0; state s = ITERATING; while (s == ITERATING) { double fx = f(x), f1x = f1(x), dx; cout << iter << "\t" << x << "\n"; if (++iter == maxiter) s = WONTSTOP; else if (fabs(f1x) < toosmall) s = NEARZERO; else { x += (dx = -fx/f1x); if (fabs(dx) < delta || fabs(f(x)) < eps) s = SUCCESS; } } return s; } inline double F(double x) { return x - exp(-x);} inline double F1(double x) { return 1. + exp(-x);} main() { double root; cout << "initial guess = "; cin >> root; state s = newton(F, F1, root); switch(s){ case SUCCESS: cout << "root = " << root << "\n"; break; case WONTSTOP: case NEARZERO: cout << "not convergent!\n"; break; default: cout << "that's very peculiar!\n"; break; } }