C 为什么这个函数有分段错误?
分段错误可能是由于在不支持它的硬件上使用长双精度编码而导致的。用C 为什么这个函数有分段错误?,c,C,分段错误可能是由于在不支持它的硬件上使用长双精度编码而导致的。用double试试同样的方法。在许多平台上,包括MSVC,double和longdouble使用相同的位数 另一个分段故障原因可能是与long double一起工作的库不兼容,请参见mingw上的gcc中的示例。如果在尝试执行fabsl时出现分段错误,则会出现这种情况 无论如何,以下代码似乎并没有达到您预期的效果: #include <stdio.h> #include <math.h> #define E
double
试试同样的方法。在许多平台上,包括MSVC,double
和longdouble
使用相同的位数
另一个分段故障原因可能是与long double
一起工作的库不兼容,请参见mingw上的gcc中的示例。如果在尝试执行fabsl
时出现分段错误,则会出现这种情况
无论如何,以下代码似乎并没有达到您预期的效果:
#include <stdio.h>
#include <math.h>
#define E 1E-3
long double Fun(long double x);
int main() {
long double a = 0;
long double b = 1;
long double temp;
while(fabsl(a - b) > E){
temp = a + b;
temp = temp / 2;
long double Funa = Fun(a);
long double Funb = Fun(b);
long double Funtemp = Fun(temp);
if(Funtemp == 0){
printf("temp = %Lf\n",temp);
break;
}
if(Funtemp * Funa < 0){
a = temp;
}
else if(Funtemp * Funb < 0) {
b = temp;
}
}
printf("a = %Lf\nb = %Lf", a, b);
return 0;
}
long double Fun(long double x){
return x*x*x + x*x - 1;
}
而且,当a
和b
之间的差值达到1E-3时,您可以继续,直到温度等于a
或b
为止<代码>a和b
彼此移动得非常快,只有当(a+b)/2
步骤四舍五入到a
或b
时才会遇到麻烦
if(Funtemp * Funa < 0){
b = temp;
}
else if(Funtemp * Funb < 0) {
a = temp;
}
else {
printf("no solution possible\n");
break;
}
它位于底部。识别您的平台可能会有所帮助;在64位intel/Linux上,这并不是我的错(虽然它似乎挂起)。@user3629249:它实际上不是递归的,在
1E-3
中的E
不是它自己的标记。@user3629249:在标准C中,没有递归宏。进一步阅读,这通常是由编译器版本和调试器版本不匹配引起的。
if(Funtemp * Funa < 0){
b = temp;
}
else if(Funtemp * Funb < 0) {
a = temp;
}
else {
printf("no solution possible\n");
break;
}
while(true){
temp = a + b;
temp = temp / 2;
if (temp == a || temp == b)
break;
...