递归调用函数时的分段错误

时间:2011-11-04 10:23:13

标签: c function recursion segmentation-fault

我正在大学学习C,而且我是编程新手。我的任务是创建一个函数,它应该为我的输入计算一个arcsin。

我尝试使用xcode调试它。一切正常,直到返回arcsin(新);叫做。然后是一个分段错误:11。我不知道为什么但在float arcsin(floatvalue){...的断点处运行第二个循环时告诉我float old和float值是NAN。

float arcsin(float value){

float old = value;
float new = value + (0.5 * ((value * value * value)/3));
float accurate = 0.00001;   

     if ((new - old) < accurate){
     return new;
     }

     else{
     return arcsin(new);
     }
}


int function_arcsin(int sigdig, float value){

    value = arcsin(value);
    printf("%.10e\n",value);

return 0;
}

3 个答案:

答案 0 :(得分:3)

当调用堆栈变得太大时会发生seg错误 - 即递归级别太多。

在您的情况下,这意味着条件(new - old) < accurate将始终评估为false - 好吧,也许并非总是如此,但足以膨胀调用堆栈。

测试你的代码我发现new(可能不是一个好的变量名称选择)一直在增长,直到它超过浮点数的限制。你的算法可能错了。

答案 1 :(得分:0)

我很确定分段错误是由过于递归引起的。尽管许多编译器可以将大量递归代码优化为迭代代码,但有些编译器不能,并且它很常见。调试选项以禁用此功能。

转换为迭代形式会停止段错误 - 但是,除非我想念我的猜测,否则请给出无限循环。我不希望工作递归解决方案在这里成为一个问题,除非你测试超出近似值收敛范围的值 - 在这种情况下,我的第一个猜测是范围内的输入-pi到+ pi应该可以用于任何可用的arcsin近似。

我不熟悉arcsin的迭代近似,我的google-fu还没有找到答案,但我怀疑你float new = ...行的计算错了。

我找到了这个链接......

http://mathforum.org/library/drmath/view/54319.html

没有那么有用 - 你的代码并不暗示任何一种方法。

答案 2 :(得分:0)

我测试了你的程序,看到永远不会结束循环:

((new - old) < accurate)  // never is true

如果您尝试使用数字&gt; 0,在10次迭代中达到nan。数字&lt; 0,继续数千次并导致过深的递归。