#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
double Pn(int n, double x)
{
if (n == -1) return 1;
if (n == 0) return 1;
return (2*n+1)*Pn(n-1,x)+ n*n*x*x*Pn(n-2,x);
}
double Qn(int n, double x)
{
if (n==-1) return 0;
if (n == 0) return 1;
return (2*n+1)*Qn(n-1,x)+ n*n*x*x*Qn(n-2,x);
}
double ratn(double x, int n)
{
return x*Qn(n,x)/Pn(n,x);
}
double atan(double x, double eps)
{
double res = 0;
for(int n=2;;n++)
{
double res2 = ratn(x,n);
if (fabs(res-res2) < eps) return res2;
res = res2;
}
}
int main(int argc, const char * argv[])
{
for(double x = 0; x < 1.5; x += 0.1)
cout << setw(10) << x << setw(10) << left << atan(x) << setw(10) << left << atan(x,0.00001) << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGNtYXRoPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmRvdWJsZSBQbihpbnQgbiwgZG91YmxlIHgpCnsKICAgIGlmIChuID09IC0xKSByZXR1cm4gMTsKICAgIGlmIChuID09IDApICByZXR1cm4gMTsKICAgIHJldHVybiAoMipuKzEpKlBuKG4tMSx4KSsgbipuKngqeCpQbihuLTIseCk7Cn0KCmRvdWJsZSBRbihpbnQgbiwgZG91YmxlIHgpCnsKICAgIGlmIChuPT0tMSkgcmV0dXJuIDA7CiAgICBpZiAobiA9PSAwKSAgcmV0dXJuIDE7CiAgICByZXR1cm4gKDIqbisxKSpRbihuLTEseCkrIG4qbip4KngqUW4obi0yLHgpOwp9Cgpkb3VibGUgcmF0bihkb3VibGUgeCwgaW50IG4pCnsKICAgIHJldHVybiB4KlFuKG4seCkvUG4obix4KTsKfQoKZG91YmxlIGF0YW4oZG91YmxlIHgsIGRvdWJsZSBlcHMpCnsKICAgIGRvdWJsZSByZXMgPSAwOwogICAgZm9yKGludCBuPTI7O24rKykKICAgIHsKICAgICAgICBkb3VibGUgcmVzMiA9IHJhdG4oeCxuKTsKICAgICAgICBpZiAoZmFicyhyZXMtcmVzMikgPCBlcHMpIHJldHVybiByZXMyOwogICAgICAgIHJlcyA9IHJlczI7CiAgICB9Cn0KCmludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICogYXJndltdKQp7CiAgICBmb3IoZG91YmxlIHggPSAwOyB4IDwgMS41OyB4ICs9IDAuMSkKICAgICAgICBjb3V0IDw8IHNldHcoMTApIDw8IHggPDwgc2V0dygxMCkgPDwgbGVmdCA8PCBhdGFuKHgpIDw8IHNldHcoMTApIDw8IGxlZnQgPDwgYXRhbih4LDAuMDAwMDEpIDw8IGVuZGw7Cn0K