Разложения arctan в ряд Тейлoра UNIX C
Разложение функции в ряд тейлера работает не стандартно в диапозонах выше -1 <= and >= 1
В википедии дан ряд тейлера и описание работы в области определения от минус бесконечности до плюс бесконечности, хотя по факту работает как и arcsin and arccos в диапозоне от 1 до -1;
long double my_atan(double x) {
long double t_at = x, last = x;
for (int k = 1; my_fabs(last) > EPS_10; ++k) {
last *= -x * x * (2 * k - 1) / (2 * k + 1);
t_at += last;
}
return t_at;
}
Я предпологаю что если функция циклично то от входящего значения просто на просто брать модуль и отдельно обрабатывать 1 и -1.
Где я допускаю ошибку? Как считать значения выше x >= 1
По советы Harry преобразовал в
long double atan(double x) { return asin(x / sqrt(1.0 + x * x)); }
long double s21_asin(double x) {
long double term = x, sum = S21_NAN;
if (-1.0 < x && x < 1.0) {
sum = term;
x *= x;
for (int k = 1; s21_fabs(term) > EPS_10; k += 2)
sum += (term *= x * k / (k + 1)) / (k + 2);
} else if (x == 1.0) {
sum = M_PI / 2.0;
} else if (x == -1.0) {
sum = -M_PI / 2.0;
}
return sum;
}
Ответы (1 шт):
Автор решения: MBo
→ Ссылка
Примените соотношение
atan(x) + atan(1/x) = Pi/2
т.е. для больших значений x используйте ряд
atan(x) = Pi/2 - 1/x + 3/x^3 - 5/x^5...
Как изменить функцию:
long double my_atan(double x) {
int flag = 0;
if (fabs(x) > 1) {
x = 1/x;
flag = 1;
}
считаете, как прежде
return flag? Pi/2 - t_at: t_at;
}