考虑以下代码:
#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;
}
这里可以注意到的第一件事是,双转换成一整型使得临时值溢出(超过INT_MAX
),这当然是一般的不确定水煤浆的。
但我更关心的是,这里FP异常可以通过常旗传递FE_INVALID
到feenableexcept
功能被困。
从cpp_reference我可以看到FE_INVALID
无关与所有四溢。
那么,为什么这里的整数溢出导致FP异常?
是因为,UB的性质是什么?
由于这是由C ++标准UB,这不是由语言本身指定当然。
但是,您的实现遵循IEEE-754 - 标准的最基础的实现自己的浮点行为 - 在这方面的规定:
当NaN或无限数不能在目标格式来表示,这不能以其它方式来指示,无效操作异常应发信号通知。当数字操作数将转换为整数的目标格式的范围之外,如果这种情况不能以其他方式表示无效操作异常应通知。
(5.8“的从浮点到整数格式转换详细信息”,重点煤矿)
如何将这些异常可能暗示留给实现时进行处理;使得陷阱对他们来说是的可能性之一。