奇怪的浮点异常

时间:2011-05-20 08:53:53

标签: c++ floating-point-exceptions

经过一些更改后,我在巨大的应用程序中遇到了浮点异常。我尝试评论我的更改,发现当我启用一个简单的函数调用时会发生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()调用它,但是问题解决了。感谢大家。

提前致谢。

1 个答案:

答案 0 :(得分:1)

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

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

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

GetMaxSize可以在此处返回int无法表示的值。