2

经过一些更改后,我在大型应用程序中遇到了浮点异常。我试图评论我的更改,发现当我启用一个简单的函数调用时会发生 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()。

添加了 Found FPE in box * scale,无法理解为什么它在没有getMaxSize()调用的情况下工作,但是问题已经解决。谢谢大家。

提前致谢。

4

1 回答 1

1

浮点异常(实际上是信号)出于不同的原因而引发。主要有:

  • 你将一个整数除以零
  • 对有符号整数的操作溢出(无符号整数必须在 C 和 C++ 中静默环绕)。

如您所见,它们与浮点数无关!这个名字是历史性的,不能在不破坏大量源代码的情况下更改(在 中有一个SIGFPE常量<signal.h>)。

它可以在这里GetMaxSize返回一个不能由 a 表示的值int

于 2011-05-20T09:57:30.650 回答