将double转换为int时会引发浮点异常

时间:2019-02-07 21:54:29

标签: c++ c++11 exception floating-point integer-overflow

考虑以下代码:

#include <iostream>
#include <climits>
#include <fenv.h>

int main()
{
    feenableexcept(FE_INVALID);
    double d = INT_MAX * 2.0f;
    int i = (int)d; // it throws here fp exception and terminates. Why ?

    std::cout << i << std::endl;

    return 0;
}

首先要注意的是,将double强制转换为int会导致临时值(大于INT_MAX)的溢出,这当然是不确定的行为。

但是我更担心以下事实:可以通过将FE_INVALID常量标志传递给feenableexcept函数来捕获FP异常。

cpp_reference中我可以看到FE_INVALID与溢出根本无关。

为什么整数在这里溢出会导致fp异常?

那是因为UB的本质吗?

1 个答案:

答案 0 :(得分:2)

由于这是C ++标准的UB,因此当然不是语言本身指定的。

但是,您的实现遵循IEEE-754 –大多数实现的标准都基于它们的浮点行为–在这方面,它指出:

  

当不能以目标格式表示NaN或无限操作数时,否则不能这样做   被指示时,应发出无效操作异常的信号。 将数字操作数转换为   一个超出目标格式范围的整数,如果出现以下情况,则应发出无效操作异常的信号   这种情况无法另外指出。

(5.8“从浮点到整数格式的转换细节”,重点是我的

在发出信号时如何处理这些异常留给实现;为他们启用陷阱是一种可能。

进一步阅读:gcc's documentation on FP exceptions

相关问题