2013-11-25 3 views
0

Это моя функция для вычисления обратного синуса числа. Это приводит к ошибке сегментации для значений между 0.51-0.8:Причина этой ошибки сегментации

double my_asin(double x) 
{ 
    double 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, которая делает именно то, что вы думаете, что не делает так что нет необходимости разместить его здесь. Не могли бы вы взглянуть и указать мне в правильном направлении? Спасибо.

+5

Если ошибка произошла в my_pow, вам нужно исправить то, что, по вашему мнению, нарушено. Не нужно публиковать его здесь. – nvoigt

+0

Подождите ... И GDB, и valgrind, и говорят, что ошибка в my_pow, так что я думаю, что это так, является причиной SegFault. Таким образом, есть все основания опубликовать его здесь. – Sinkingpoint

+0

Согласно ответу interjay ниже на странице, проблема была НЕ в my_pow. Вот почему я разместил его здесь. Он просто переносился на my_pow, где произошла ошибка. Но my_pow не вызвал ошибку. – imre

ответ

5

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

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

+0

Спасибо, я положил эту часть из функции my_asin и поместил ее в свою собственную функцию, поэтому нет рекурсии. Спасибо за ваше время и помощь. – imre

Смежные вопросы