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

Это моя функция для вычисления обратного синуса числа. Это приводит к ошибке сегментации для значений между 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.