2013-11-25 2 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

관련 문제