经过一些更改,我在大型应用程序中有一个浮点异常。我试图评论我的更改,发现启用一个简单的函数调用时会发生FPE。

api::getMaxSize();

它只是返回值。
看起来像这样
int api::getMaxSize() { return 536870912; };

这是静态成员函数。当我将其移至头文件时,一切正常。
我很困惑,那会是什么?看起来API处于另一个模块中并链接为动态库,但是这怎么会引起问题呢?

添加了

函数maxBox()是模板,并在api.h头文件中实现。
该函数调用getMaxSize()
template <typename T>
static rectangle<T> maxBox()
{
    return rectangle<T>(
        getMinSize(), getMinSize(),
        getMaxSize(), getMaxSize()
    );
}

这是调用代码
if (!api::maxBox<double>().contains(box * scale)) { /* api::getMaxSize(); */ }

如果启用了getMaxSize()调用,程序将开始抛出FPE,但实际上从未调用过getMaxSize()。

添加了
box * scale中找到了FPE,无法理解为什么没有getMaxSize()调用它仍能正常工作,但是问题得以解决。感谢大家。

提前致谢。

最佳答案

浮点异常(实际上是信号)由于不同的原因而产生。主要的是:

  • 您将整数除以零
  • 有符号的整数进行的操作溢出(无符号整数必须在C和C++中以静默方式环绕)。

  • 如您所见,它们与浮点数无关!该名称是历史名称,在不破坏大量源代码的情况下就无法更改(SIGFPE中存在<signal.h>常量)。

    此处GetMaxSize返回的值不能由int表示。

    10-06 10:37