铸造双时为int浮点异常被抛出

问题描述 投票:1回答:1

考虑以下代码:

#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_INVALIDfeenableexcept功能被困。

cpp_reference我可以看到FE_INVALID无关与所有四溢。

那么,为什么这里的整数溢出导致FP异常?

是因为,UB的性质是什么?

c++ c++11 exception floating-point integer-overflow
1个回答
3
投票

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

但是,您的实现遵循IEEE-754 - 标准的最基础的实现自己的浮点行为 - 在这方面的规定:

当NaN或无限数不能在目标格式来表示,这不能以其它方式来指示,无效操作异常应发信号通知。当数字操作数将转换为整数的目标格式的范围之外,如果这种情况不能以其他方式表示无效操作异常应通知。

(5.8“的从浮点到整数格式转换详细信息”,重点煤矿)

如何将这些异常可能暗示留给实现时进行处理;使得陷阱对他们来说是的可能性之一。

延伸阅读:gcc's documentation on FP exceptions

© www.soinside.com 2019 - 2024. All rights reserved.