为啥我会收到“浮点异常(核心转储)”?

Posted

技术标签:

【中文标题】为啥我会收到“浮点异常(核心转储)”?【英文标题】:Why am I getting "floating point exception (core dumped)"?为什么我会收到“浮点异常(核心转储)”? 【发布时间】:2019-02-07 03:48:05 【问题描述】:

因此,当我输入正数或正数和负数时,代码可以正常工作,但只是输入负数会导致浮点错误,我知道除以零会导致这种情况,但我正在按输入数潜水

#include <stdio.h>
int main()

    int integer, pos, neg;
    int poscounter, negcounter;
    integer = 0;
    pos = 0;
    neg = 0;
    poscounter = 0;
    negcounter = 0;

    do 
        printf("Please enter an integer:");

        scanf("%d", &integer);

        if (integer > 0) 
            pos += integer;
            poscounter++;
        
        else
            neg += integer;
        negcounter++;

     while (integer != 0);

    printf("Positive average: = %d", pos / poscounter);
    printf("Negative average: = %d", neg / negcounter);

所以输入 -3 -2 -1 0 的输出应该是 "负均值:-2"

【问题讨论】:

如果poscounter 是零,你就除以零。 请注意,negcounter 始终递增。它不是 else 块的一部分。你需要使用else neg += integer; negcounter++; 可能重复What is a debugger and how can it help me diagnose problems? 【参考方案1】:
#include <stdio.h>
int main()

    int integer, pos, neg;
    int poscounter, negcounter;
    integer = 0;
    pos = 0;
    neg = 0;
    poscounter = 0;
    negcounter = 0;

    do 
        printf("Please enter an integer:");

        scanf("%d", &integer);

        if (integer > 0) 
            pos += integer;
            poscounter++;
        
        else if(integer < 0)    // Added else if for the logic as it was considering 0 as negative
        
            neg += integer;
            negcounter++;
        

     while (integer != 0);
    printf("posc = %d\n", poscounter);      // Printed for confirmation
    printf("negc = %d\n", negcounter);      // Printed for confirmation

    /* Added these two ifs so that it can check any of the counters is not zero and it will not give (core dumped) */

    if(poscounter)
        printf("Positive average: = %d\n", pos / poscounter);
    if(negcounter)
        printf("Negative average: = %d\n", neg / negcounter);

        return 0;       // Adding this is a good practice

嘿,他们的逻辑有点问题,因为当没有遇到正/负时,它是将表达式除以 0。此外,它将 0 视为负整数。 请通过 cmets 它可能会有所帮助

【讨论】:

为什么添加 if 语句 "if(poscounter)" 工作基本上是说 poscounter 中是否有任何值打印以下内容?? 看,在那里,你的poscounter 被用作股息,所以如果它是零,它会产生错误,你得到的那个。首先 pos/poscounter 被评估,然后 printf() 正在使用它。 如果你觉得这个答案有用,请批准它:)【参考方案2】:

这会在输入 -3,-2,-1,0 时崩溃,因为 if (integer > 0) 始终为 false,因此 poscounter 不会在任何时候递增,因此在 while 循环后 poscounter 将为零。

printf("正平均值: = %d", pos / poscounter);会因为由零操作决定而导致程序崩溃。

最好有一个 if 检查分母,并确保它在 devide 操作中使用之前不为零:

if (0 != poscounter)
     printf("Positive average: = %d", pos / poscounter);

这将确保 printf 仅在 poscounter 为非零值的有效情况下执行。

【讨论】:

【参考方案3】:

if (integer &gt; 0) 永远不会执行,所以poscounter 永远不会增加,所以最后除法pos / poscounter 不能工作。

【讨论】:

以上是关于为啥我会收到“浮点异常(核心转储)”?的主要内容,如果未能解决你的问题,请参考以下文章

浮点异常(核心转储)#694457

浮点异常(核心转储)cpp

浮点异常(核心转储)非常奇怪

为 Linux 创建 C 程序时出现浮点异常(核心转储)

线性同余生成器的浮点异常(核心转储)

在汇编中进行除法时出现浮点异常(核心转储)