gpt4 book ai didi

c - 为什么这个函数有段错误?

转载 作者:太空宇宙 更新时间:2023-11-03 23:36:46 25 4
gpt4 key购买 nike

#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;
}

我不知道为什么 Fun() 有段错误?真的很困惑。

以下是 clion 报告的信息:

clion: 
Fun(a) = -var-create: unable to create variable object
Signal = SIGSEGV (Segmentation fault)

最佳答案

您的段错误可能是由于在不支持它的硬件上使用 long double 引起的。只需尝试使用 double 进行同样的操作。在包括 MSVC 在内的许多平台上,doublelong double 使用相同的位数。

另一个段错误原因可能是使用long double 的不兼容库,参见示例this report在 mingw 上的 gcc 中。如果您在尝试执行 fabsl 时发生段错误,就会出现这种情况。

无论如何,下面的代码似乎没有达到您的预期:

    if(Funtemp * Funa < 0){
a = temp;
}
else if(Funtemp * Funb < 0) {
b = temp;
}

这很容易产生死循环。

您通常希望 FunaFunb 始终具有相反的符号。因此,如果 FunaFuntemp 符号相反,您希望将 temp 分配给 b。反之亦然。也许还添加一个测试,以防所有 3 个都具有相同的符号:

    if(Funtemp * Funa < 0){
b = temp;
}
else if(Funtemp * Funb < 0) {
a = temp;
}
else {
printf("no solution possible\n");
break;
}

并且,当 ab 之间的差异达到 1E-3 时,您可以继续,而不是停止,直到 temp 等于 abab 正在快速地向彼此移动,只有当 (a+b)/2 步骤四舍五入到任何一个时才会遇到麻烦ab

while(true){
temp = a + b;
temp = temp / 2;
if (temp == a || temp == b)
break;
...

关于c - 为什么这个函数有段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58685951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com