这是我计算一个数的逆正弦的函数。它会导致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中,它正是你认为它所做的,所以不需要在这里发布它。你能看一眼,给我指个正确的方向吗?非常感谢。

最佳答案

假设x是sqrt(2)/2(约0.707)。函数使用参数sqrt(1-x*x)递归调用自身,该参数等于x。由于无限递归,这将导致堆栈溢出。
在该值周围x的其他值也会发生同样的情况。

关于c - 段错误的原因,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20189931/

10-11 22:06
查看更多