Причина этой ошибки сегментации

Это моя функция для вычисления обратного синуса числа. Это приводит к ошибке сегментации для значений между 0,51-0,8:

****** my_asin(****** x)
{
 ****** sum = x;
 if(x < -1.0 || x > 1.0)
 {
 /* error handling */
 }
 else if(x < -0.5)
 {
 sum = -0.5*PI + my_asin(my_sqrt(1-my_pow(x,2))); // SIG_SEGV
 return sum;
 }
 else if(x > 0.5)
 {
 sum = 0.5*PI - my_asin(my_sqrt(1-my_pow(x,2))); // SIG_SEGV
 return sum;
 }

 /* variable initialization */

 while(my_abs(b - a) > EPSILON2)
 {
 /*code*/
 }
 /* return result */
}

GDB и valgrind говорят мне, что ошибка возникает в функции my_pow, которая делает именно то, что, по вашему мнению, делает, поэтому нет необходимости публиковать ее здесь. Не могли бы вы взглянуть и указать мне в правильном направлении? Спасибо.

1 ответ

Предположим, что x является sqrt(2)/2 (около 0,707). Ваша функция рекурсивно вызывает себя с параметром sqrt(1-x*x), который равен x. Это приведет к переполнению стека из-за бесконечной рекурсии.

То же самое произойдет и для других значений x вокруг этого значения.

licensed under cc by-sa 3.0 with attribution.