fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. template <class F>
  5. double differentiate(F f, double x, double eps = 1e-8) {
  6. const int n = 10;
  7. const double alpha = 1.4;
  8. double h = 1e-2, a[n][n], ans = 1.0/0.0, err = 1.0/0.0;
  9.  
  10. a[0][0] = (f(x + h) - f(x - h)) / (2 * h);
  11. for (int i = 1; i < n; ++i) {
  12. h /= alpha;
  13. a[0][i] = (f(x + h) - f(x - h))/(2 * h);
  14. double fac = alpha * alpha;
  15. for (int j = 1; j <= i; ++j) {
  16. a[j][i] = (a[j-1][i] * fac - a[j-1][i-1])/(fac - 1.0);
  17. fac *= alpha * alpha;
  18. double errt = max(fabs(a[j][i] - a[j-1][i]), fabs(a[j][i] - a[j-1][i-1]));
  19. if (errt <= err) {
  20. err = errt;
  21. ans = a[j][i];
  22. if (err < eps) return ans;
  23. }
  24. }
  25. if (fabs(a[i][i] - a[i-1][i-1]) >= 2 * err) break;
  26. }
  27. return ans;
  28. }
  29.  
  30. int main() {
  31. cout << fixed << setprecision(15);
  32. cout << 2*differentiate([](double x) { return sin(x); }, M_PI/4) << endl;
  33. }
  34.  
  35.  
Success #stdin #stdout 0s 4260KB
stdin
Standard input is empty
stdout
1.414213562373048