Разложения 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;
}
→ Ссылка