我有一个问题针对下面的代码片段:
long l=9223372036854775807L;
float f=static_cast<float>(l);
根据IEEE754标准,长整型值无法被精确地表示。
我的问题是如何处理有损转换:
- 是否采用最接近的浮点表示?
- 是否采用下一个较小/较大的表示?
- 或者采用其他方法?
我知道这个问题(在将int转换为float时背景中发生了什么),但这并没有回答我的问题。
我有一个问题针对下面的代码片段:
long l=9223372036854775807L;
float f=static_cast<float>(l);
根据IEEE754标准,长整型值无法被精确地表示。
我的问题是如何处理有损转换:
我知道这个问题(在将int转换为float时背景中发生了什么),但这并没有回答我的问题。
4.3.1 舍入方向属性为最近值
roundTiesToEven,将提供浮点数,它是最接近无限精度结果的浮点数。如果两个浮点数与不能表示的无限精度结果的距离相等,则选择最后一位为偶数的那个浮点数。
roundTiesToAway,将提供浮点数,它是最接近无限精度结果的浮点数。如果两个浮点数与不能表示的无限精度结果的距离相等,则选择幅度更大的那个浮点数。
4.3.2 指定舍入属性
roundTowardPositive,结果应为格式中最接近且不小于无限精度结果的浮点数(可能为+∞)。
roundTowardNegative,结果应为格式中最接近且不大于无限精度结果的浮点数(可能为-∞)。
roundTowardZero,结果应为格式中最接近且不大于无限精度结果的浮点数。
4.3.3 舍入属性要求
对于二进制格式的结果,默认的舍入方向属性应为roundTiesToEven。
因此,对于默认情况下将应用建议1,但仅在未选择另一种模式的情况下。
C++标准库从C标准继承了 <cfenv>
。该头文件提供了宏、函数和类型,用于与浮点环境交互,包括舍入模式。