#include <bits/stdc++.h>
using namespace std;
template <class F>
double differentiate(F f, double x, double eps = 1e-8) {
const int n = 10;
const double alpha = 1.4;
double h = 1e-2, a[n][n], ans = 1.0/0.0, err = 1.0/0.0;
a[0][0] = (f(x + h) - f(x - h)) / (2 * h);
for (int i = 1; i < n; ++i) {
h /= alpha;
a[0][i] = (f(x + h) - f(x - h))/(2 * h);
double fac = alpha * alpha;
for (int j = 1; j <= i; ++j) {
a[j][i] = (a[j-1][i] * fac - a[j-1][i-1])/(fac - 1.0);
fac *= alpha * alpha;
double errt = max(fabs(a[j][i] - a[j-1][i]), fabs(a[j][i] - a[j-1][i-1]));
if (errt <= err) {
err = errt;
ans = a[j][i];
if (err < eps) return ans;
}
}
if (fabs(a[i][i] - a[i-1][i-1]) >= 2 * err) break;
}
return ans;
}
int main() {
cout << fixed << setprecision(15);
cout << 2*differentiate([](double x) { return sin(x); }, M_PI/4) << endl;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZSA8Y2xhc3MgRj4KZG91YmxlIGRpZmZlcmVudGlhdGUoRiBmLCBkb3VibGUgeCwgZG91YmxlIGVwcyA9IDFlLTgpIHsKICBjb25zdCBpbnQgbiA9IDEwOwogIGNvbnN0IGRvdWJsZSBhbHBoYSA9IDEuNDsKICBkb3VibGUgaCA9IDFlLTIsIGFbbl1bbl0sIGFucyA9IDEuMC8wLjAsIGVyciA9IDEuMC8wLjA7CgogIGFbMF1bMF0gPSAoZih4ICsgaCkgLSBmKHggLSBoKSkgLyAoMiAqIGgpOwogIGZvciAoaW50IGkgPSAxOyBpIDwgbjsgKytpKSB7CiAgICBoIC89IGFscGhhOwogICAgYVswXVtpXSA9IChmKHggKyBoKSAtIGYoeCAtIGgpKS8oMiAqIGgpOwogICAgZG91YmxlIGZhYyA9IGFscGhhICogYWxwaGE7CiAgICBmb3IgKGludCBqID0gMTsgaiA8PSBpOyArK2opIHsKICAgICAgYVtqXVtpXSA9IChhW2otMV1baV0gKiBmYWMgLSBhW2otMV1baS0xXSkvKGZhYyAtIDEuMCk7CiAgICAgIGZhYyAqPSBhbHBoYSAqIGFscGhhOwogICAgICBkb3VibGUgZXJydCA9IG1heChmYWJzKGFbal1baV0gLSBhW2otMV1baV0pLCBmYWJzKGFbal1baV0gLSBhW2otMV1baS0xXSkpOwogICAgICBpZiAoZXJydCA8PSBlcnIpIHsKICAgICAgICBlcnIgPSBlcnJ0OwogICAgICAgIGFucyA9IGFbal1baV07CiAgICAgICAgaWYgKGVyciA8IGVwcykgcmV0dXJuIGFuczsKICAgICAgfQogICAgfQogICAgaWYgKGZhYnMoYVtpXVtpXSAtIGFbaS0xXVtpLTFdKSA+PSAyICogZXJyKSBicmVhazsKICB9CiAgcmV0dXJuIGFuczsKfQoKaW50IG1haW4oKSB7CiAgY291dCA8PCBmaXhlZCA8PCBzZXRwcmVjaXNpb24oMTUpOwogIGNvdXQgPDwgMipkaWZmZXJlbnRpYXRlKFtdKGRvdWJsZSB4KSB7IHJldHVybiBzaW4oeCk7IH0sIE1fUEkvNCkgPDwgZW5kbDsKfQoK