Glu*_*ton 25 c++ undefined-behavior
无穷大(由浮点数表示)转换为整数是否为未定义的行为?
标准说:
4.10浮动积分转换
可以将浮点类型的prvalue转换为整数类型的prvalue.转换截断; 也就是说,丢弃小数部分.如果截断的值无法在目标类型中表示,则行为未定义.
但我不知道"截断值是否无法表示"涵盖无穷大.
我试图理解为什么,std::numeric_limits<int>::infinity()并static_cast<int>(std::numeric_limits<float>::infinity() )有不同的结果.
#include <iostream>
#include <limits>
int main ()
{
std::cout << std::numeric_limits<int>::infinity () << std::endl;
std::cout << static_cast<int> (std::numeric_limits<float>::infinity () ) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
0
-2147483648
Run Code Online (Sandbox Code Playgroud)
结果std::numeric_limits<int>::infinity() 很明确,等于0,但我找不到任何有关无限投射的信息.
我试图理解为什么
std::numeric_limits<int>::infinity()并static_cast<int>(std::numeric_limits<float>::infinity() )有不同的结果。
标准说:18.3.2.4
静态 constexpr T infinity() noexcept;
47 表示正无穷大(如果有)。[216]
48 对所有 has_infinity != false 的特化有意义。在 is_iec559 != false 的专业化中是必需的。
- - 编辑 - -
根据 18.3.2.7/1 [numeric.special]
1 应为所有成员提供所有专业。但是,许多值只需要在特定条件下才有意义(例如,epsilon() 仅在 is_integer 为 false 时才有意义)。任何不“有意义”的值都应设置为 0 或 false。
| 归档时间: |
|
| 查看次数: |
2551 次 |
| 最近记录: |