fork download
  1.  
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. pair<double, double> horner(const vector<double> &a, double x) {
  6. double p = a[0], dp = 0;
  7. for (int i = 1; i < (int)a.size(); i++) {
  8. dp = dp * x + p;
  9. p = p * x + a[i];
  10. }
  11. return {p, dp};
  12. }
  13.  
  14. int main() {
  15. int n;
  16. cin >> n;
  17. vector<double> a(n + 1);
  18. for (int i = 0; i <= n; i++) cin >> a[i];
  19.  
  20. double x0;
  21. cin >> x0;
  22.  
  23. const double E = 1e-8;
  24. cout << fixed << setprecision(10);
  25. cout << "Iter\t" << setw(12) << "x"
  26. << "\t" << setw(12) << "f(x)"
  27. << "\t" << setw(12) << "f'(x)"
  28. << "\t" << setw(12) << "error\n";
  29.  
  30. for (int i = 1; i <= 100; i++) {
  31. auto [fx, dfx] = horner(a, x0);
  32.  
  33. if (fabs(dfx) < 1e-14) {
  34. cout << "Derivative too small at iteration " << i << ", stopping.\n";
  35. break;
  36. }
  37.  
  38. double x1 = x0 - fx / dfx;
  39. double error = fabs(x1 - x0);
  40.  
  41. cout << i << "\t"
  42. << setw(12) << x0 << "\t"
  43. << setw(12) << fx << "\t"
  44. << setw(12) << dfx << "\t"
  45. << setw(12) << error << "\n";
  46.  
  47. if (fabs(x1 - x0) < E * max(1.0, fabs(x1))) {
  48. cout << "Root = " << x1 << "\n";
  49. break;
  50. }
  51.  
  52. x0 = x1;
  53. }
  54.  
  55. return 0;
  56. }
Success #stdin #stdout 0.01s 5320KB
stdin
2
1 0 -2
1
stdout
Iter	           x	        f(x)	       f'(x)	      error
1	1.0000000000	-1.0000000000	2.0000000000	0.5000000000
2	1.5000000000	0.2500000000	3.0000000000	0.0833333333
3	1.4166666667	0.0069444444	2.8333333333	0.0024509804
4	1.4142156863	0.0000060073	2.8284313725	0.0000021239
5	1.4142135624	0.0000000000	2.8284271247	0.0000000000
Root = 1.4142135624