Одним из моих заданий на С было написать приближение arctan(x)
на языке C. Уравнение, на котором я должен основывать это:
arctan(x)=\sum {k=0}^{\infty }(-1)^{k} \tfrac{x^{2k+1}}{2k+1}
![enter image description here](https://latex.codecogs.com/gif.latex?arctan%28x%29%3D%5Csum%20_%7Bk%3D0%7D%5E%7B%5Cinfty%20%7D%28-1%29%5E%7Bk%7D%20%5Ctfrac%7Bx%5E%7B2k+1%7D%7D%7B2k+1%7D)
Кроме того, x определяется только как -1<=x<=1
.
Вот мой код.
#include <stdio.h>
#include <math.h>
double main(void) {
double x=1;
double k;
double sum;
double sum_old;
int count;
double pw(double y, double n) {
double i;
double number = 1;
for (i = 0; i < n; i++) {
number *= y;
}
return(number);
}
double fc (double y) {
double i;
double number = 1;
for (i = 1; i <= y; i++){
number *= i;
}
return(number);
}
if(x >= (-1) && x <= 1) {
for(k=0; sum!=sum_old; k++) {
sum_old = sum;
sum += pw((-1), k) * pw(x, (2*k) + 1)/((2*k) + 1);
count++;
printf("%d || %.17lf\n", count, sum);
}
printf("My result is: %.17lf\n",sum);
printf("atan(%f) is: %.17f\n", x, atan(x));
printf("My result minus atan(x) = %.17lf\n", sum - atan(x));
} else {
printf("x is not defined. Please choose an x in the intervall [-1, 1]\n");
}
return 0;
}
Кажется, что он отлично работает с каждым значением, кроме значений 1
и -1
. Если x=1
, то вывод заканчивается на:
...
7207 || 0.78543285189457468
7208 || 0.78536
Принимая во внимание, что выходные данные должны выглядеть больше как это. В этом случае х = 0,5.
25 || 0.46364760900080587
26 || 0.46364760900080587
My result is: 0.46364760900080587
atan(0.500000) is: 0.46364760900080609
My result minus atan(x) atan(x) = -0.00000000000000022
Как я могу улучшить свой код, чтобы он мог работать с x=1
и x=-1
.
Заранее спасибо.
PS: я использую свою собственную созданную функцию pw()
вместо pow()
, потому что я хотел обойти ограничение не использовать pow()
, поскольку у нас этого еще не было в наших лекциях.
PPS: Буду признателен за советы по улучшению моего кода.