#include <math.h>
#include <stdio.h>
#include <stdlib.h>
double macheps()
{
double e = 1.0;
while (1.0 + e / 2.0 > 1.0)
e /= 2.0;
return e;
}
struct Point
{
double x;
double y;
};
double f(unsigned p, double x)
{
double y = 0.;
for(unsigned i = 0; i <= p; ++i) {
y += (2 * (pow(x , 2 * i + 1) / (2 * i + 1)));
}
return y;
}
double g(double x)
{
return log((1 + x) / (1 - x));
}
void TaylorCalculation(unsigned iterationCount, double a, double b, double (*taylor_f)(unsigned, double), double (*real_f)(double))
{
double step = ( b - a ) / iterationCount;
struct Point* points = (struct Point*)malloc(sizeof(struct Point) * iterationCount);
double eps = macheps();
double x = a;
for(unsigned i = 0; i < iterationCount; ++i, x+=step) {
unsigned p = 0;
points[i].y = 10000;
while(fabs(real_f(x) - taylor_f(p, x)) > eps * 100)
{
points[i].x = x;
points[i].y = taylor_f(p, x);
++p;
if(p >= 100) {
break;
}
}
printf("%d| %lf %lf %lf\n", i, x, real_f(x), points[i].y);
}
}
int main()
{
unsigned n;
double a = 0., b = 0.5;
scanf("%u", &n);
TaylorCalculation(n, a, b, f, g);
}
I2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCmRvdWJsZSBtYWNoZXBzKCkKewoKICAgIGRvdWJsZSBlID0gMS4wOwoKICAgIHdoaWxlICgxLjAgKyBlIC8gMi4wID4gMS4wKQogICAgICAgIGUgLz0gMi4wOwogICAgcmV0dXJuIGU7Cgp9CgoKc3RydWN0IFBvaW50CnsKCiAgICBkb3VibGUgeDsKICAgIGRvdWJsZSB5OwoKfTsKCgpkb3VibGUgZih1bnNpZ25lZCBwLCBkb3VibGUgeCkKewoKICAgIGRvdWJsZSB5ID0gMC47CgogICAgZm9yKHVuc2lnbmVkIGkgPSAwOyBpIDw9IHA7ICsraSkgewoKICAgICAgICB5ICs9ICgyICogKHBvdyh4ICwgMiAqIGkgKyAxKSAvICgyICogaSArIDEpKSk7CgogICAgfQoKICAgIHJldHVybiB5OwoKfQoKZG91YmxlIGcoZG91YmxlIHgpCnsKCiAgICByZXR1cm4gbG9nKCgxICsgeCkgLyAoMSAtIHgpKTsKCn0KCgp2b2lkIFRheWxvckNhbGN1bGF0aW9uKHVuc2lnbmVkIGl0ZXJhdGlvbkNvdW50LCBkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAoKnRheWxvcl9mKSh1bnNpZ25lZCwgZG91YmxlKSwgZG91YmxlICgqcmVhbF9mKShkb3VibGUpKQp7CgogICAgZG91YmxlIHN0ZXAgPSAoIGIgLSBhICkgLyBpdGVyYXRpb25Db3VudDsKICAgIHN0cnVjdCBQb2ludCogcG9pbnRzID0gKHN0cnVjdCBQb2ludCopbWFsbG9jKHNpemVvZihzdHJ1Y3QgUG9pbnQpICogaXRlcmF0aW9uQ291bnQpOwogICAgZG91YmxlIGVwcyA9IG1hY2hlcHMoKTsKICAgIGRvdWJsZSB4ID0gYTsKCiAgICBmb3IodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVyYXRpb25Db3VudDsgKytpLCB4Kz1zdGVwKSB7CgogICAgICAgIHVuc2lnbmVkIHAgPSAwOwogICAgICAgIHBvaW50c1tpXS55ID0gMTAwMDA7CiAgICAgICAgd2hpbGUoZmFicyhyZWFsX2YoeCkgLSB0YXlsb3JfZihwLCB4KSkgPiBlcHMgKiAxMDApCiAgICAgICAgewoKICAgICAgICAgICAgcG9pbnRzW2ldLnggPSB4OwogICAgICAgICAgICBwb2ludHNbaV0ueSA9IHRheWxvcl9mKHAsIHgpOwogICAgICAgICAgICArK3A7CiAgICAgICAgICAgIGlmKHAgPj0gMTAwKSB7CgogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwcmludGYoIiVkfCAlbGYgJWxmICVsZlxuIiwgaSwgeCwgcmVhbF9mKHgpLCBwb2ludHNbaV0ueSk7CgogICAgfQp9CgppbnQgbWFpbigpCnsKCiAgICB1bnNpZ25lZCBuOwogICAgZG91YmxlIGEgPSAwLiwgYiA9IDAuNTsKICAgIHNjYW5mKCIldSIsICZuKTsKICAgIFRheWxvckNhbGN1bGF0aW9uKG4sIGEsIGIsIGYsIGcpOwoKfQ==