Wydaje mi się, że ten szereg dla pewnych dużych x
, może być rozbieżny; nie wiem, ale z tego by wynikało, że nie można obliczać wyniku z pewną dokładnością (kolejne wyrazy moga być coraz większe). Lepiej, dać funkcję z ograniczoną ilością iteracji:
int my_sign(int i) {
if (i % 2 == 0) return 1;
return -1;
}
double series(double x, int n) {
if (n == 1) return 1.0;
if (n == 2) return 1.0 + (1 * x) / 4;
if (n == 3) return 1.0 + (1 * x) / 4 + (3 * x * x) / 32;
double num = 3;
double den = 8;
double s = 1.34375;
double x1 = x * x;
for (int i = 4, s_num = 7, s_den = 12; i <= n; ++i, s_num += 4, s_den += 4) {
num *= s_num;
den *= s_den;
s += (my_sign(i) * ((num / (4.0 * den)) * x1 * x));
x1 *= x;
}
return s;
}
Trzy pierwsze elementy są zwracane "ifami", bo są nieregularne, żeby pętla była mentalnie do ogarnięcia.
EDYCJA: Zedytowałem kod, jest poprawne akumulowanie faktorów w liczniku i mianowniku, oraz potęgowanie x
- a.