这是我计算数字的反正弦函数。它导致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函数中,它完全按照您的想法执行,因此无需在此处发布。你能看一眼并指出我正确的方向吗?非常感谢。
答案 0 :(得分:5)
假设x是sqrt(2)/2
(约0.707)。您的函数以参数sqrt(1-x*x)
递归调用自身,该参数等于x
。由于无限递归,这将导致堆栈溢出。
围绕该值的x
的其他值也会发生同样的情况。