【问题标题】:Why do I get a "floating point exception"为什么会出现“浮点异常”
【发布时间】:2017-05-31 20:24:51
【问题描述】:

不寻求解决方案或任何东西,只是一个一般性问题。当调用 getgcd() 函数时,我得到一个浮点异常。为什么是这样?我对此进行了研究,但找不到直接的答案。谢谢,下面也是我正在使用的代码。

 #include <iostream>
using namespace std;

class D: public E {
private:
        int var2;

public:

        D(int var, int var2) : E(var) {
                var2 = var2;
        }

        void getgcd() {
                int temp;
                int newVar = E::var;
                while (var != 0) {
                        temp = newVar % var2;
                        newVar = var2;
                        var2 = temp;
                }
                cout << "The GCD of " << newVar << " and " << var2 << " is " << var2 << endl;
        }
};

#include <iostream>
#include "A4p2.cpp"
#include "A4p3.cpp"
using namespace std;

int main(int argc, char *argv[]) {
        int x, y;
        x = atoi(argv[1]);
        y = atoi(argv[2]);

        if (x < 1 || x > 50) {
                cout << "Input must be between 1-50" << endl;
                exit(0);
        }

        E test(x);
        D test1(x, y);
        test.play();
        test1.getgcd();
        return 0;
}

【问题讨论】:

  • #include "A4p2.cpp" #include "A4p3.cpp"别那样做!
  • 您能否包含您的完整代码,包括您对class E 的定义?
  • 是的,这是一个分配,但分配不是浮点异常,我只是遇到它并决定询问。宽容一点
  • 一般回答:很可能,var2 为零(例如,除以零会触发 FPE)- 为什么是这样,我们需要更多信息,例如 E 的定义以及 A4p[23]。 cpp 保持。

标签: c++ exception greatest-common-divisor


【解决方案1】:

不幸的是,Linux 在SIGFPE 上将 integer 除法/模数映射为零,然后天真地打印出“浮点异常”。我认为我从未见过它来自浮点运算(可能是因为大多数 FP 异常必须显式打开,而整数除以零在 x86 上总是出错)。

很可能你的var2 等于零

temp = newVar % var2;

这可能是由于在该循环中,您正在检查var,但使用/修改var2

while (var != 0) {
        temp = newVar % var2;
        newVar = var2;
        var2 = temp;
}

你可能想要while (var2 != 0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 2021-08-23
    相关资源
    最近更新 更多