为什么此功能存在分段错误?

#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)
xuehua1911 回答:为什么此功能存在分段错误?

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

另一个分段错误原因可能是与long double兼容的库不兼容,例如mingw上gcc中的this report。如果您在尝试执行fabsl时发生细分错误,便会是这种情况。

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

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

这很容易产生无限循环。

您通常希望FunaFunb始终具有相反的符号。因此,如果FunaFuntemp的符号相反,则需要为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时停止,您还可以继续直到温度等于abab彼此之间的步伐非常快,只有在(a+b)/2步骤四舍五入为ab时才会遇到麻烦。

while(true){
    temp = a + b;
    temp = temp / 2;
    if (temp == a || temp == b)
        break;
    ...
本文链接:https://www.f2er.com/3169592.html

大家都在问