Witam,
Mam problem zakodawałem funkcję arctan rozwiniętą w szereg Taylora, poniżej kod
#include <stdio.h>
#include <math.h>
int sgn(double x) {
if (x > 0)
return 1;
else if (x < 0)
return -1;
else
return 0;
}
double arctg(double x) {
double suma, wyraz;
int znak, n = 1;
if (fabs(x) <= 1) {
suma = 0;
wyraz = x;
znak = -1;
do {
n=1;
suma = suma + wyraz;
wyraz = wyraz * znak * ((2 * n - 1) * x * x) / (2 * n + 1);
znak = znak * (-1);
n++;
} while (abs(suma) > 1e-7);
return suma;
}
else {
suma = sgn(x) * (M_PI / 2);
wyraz = -1 / x;
znak = -1;
do {
suma = suma + wyraz;
wyraz = wyraz * znak * 1 / (((2 * n - 1) * x * x) / (2 * n + 1));
znak = znak * (-1);
n++;
} while (fabs(wyraz) > 1e-7);
return suma;
}
}
int main(void) {
double x = -10;
printf("%10s %10s %10s %10s\n","x","arctg(x)","atan(x)","error");
while (x <= 10) {
printf("%10f %3.7f %3.7f %3.7f\n", x, arctg(x), atan(x), fabs(arctg(x) - atan(x)) / fabs(atan(x)));
x += 1;
}
getchar();
getchar();
return 0;
}
Tak wygląda rozwinięcie dla |x|<= 1 a tak dla |x| > 1 sgn(x)*Pi/2 - 1/x + 1/3x^2 - 1/5x^5+...
Problem polega na tym, że błąd wychodzi za duży, powinno być co najmniej 5 zer a dopiero później jakieś cyfry.
Proszę o pomoc.