我正在大学学习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;
}
答案 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,继续数千次并导致过深的递归。