【问题标题】:Floating point exception (core dumped) #694457浮点异常(核心转储)#694457
【发布时间】:2018-10-19 10:07:16
【问题描述】:

我不太了解C++,也不明白为什么会出现这个错误: 浮点异常(核心转储)

我不知道该如何解决。

#include <iostream>

using namespace std;

int main() {

    int a = 251;
    int b = 0;

    while (a > 0) {
        a = a / 10;
        b++;
    }
    int c = 2;
    int d = 1;
    while (c <= b) {
        d = d * 10;
        c++;
    }
    cout << d;
    int answer = 0;
    int f = d;
    int g = 1;
    float help;
    while (b > 0) {
        help = (a / (d * g)) *(d / f);
        answer = answer + (int)help;
        a = a % (d * g);
        g = g * (1 / 10);
        f = f * (1 / 10);
        b--;
    }

    cout << answer;

    return 0;
}

【问题讨论】:

  • 猜测gf 变为0,这会让你除以零。
  • 可能help 会溢出足够小的f 值。使用调试器逐步找出答案。

标签: c++


【解决方案1】:

与直觉相反,“浮点异常”是当您尝试执行整数除以零时由您的 CPU 和/或操作系统抛出的异常。

C++ 使这个操作未定义;您的计算机完全禁止它。

在使用调试器单步执行程序时检查所有变量,并记住1 / 10 是零,而不是 0.1,因为它是整数除法。 (此错误会传播到循环的下一次迭代,您会尝试将此零值用作除数。)

浮点数除以零的定义更明确,ISTR 会剔除特殊值 inf

【讨论】:

    【解决方案2】:

    每当您“转储核心”时,您都可以使用 GDB 来调查您的崩溃:gdb binary core。以下是您的代码中发生的情况:

    Program terminated with signal SIGFPE, Arithmetic exception.
    #0  (...)
        at (...):LINE_NUM
    LINE_NUM             help = (a /(d * g)) *(d /f);
    

    在第二次迭代期间,您的 fg 已经等于 0。在 Linux 中,您可以捕获 SIGFPE 信号并处理错误,或者您可以在执行除法之前检查代码中的变量。

    【讨论】:

      【解决方案3】:

      As answered here

      更好的使用:

      g = g/10;
      f = f/10;
      

      对于整数值。 除法前还要检查 gf 是否不等于 0。

      我希望这会有所帮助;)

      【讨论】:

        猜你喜欢
        • 2021-11-17
        • 2011-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多