注意:了解 IEEE 754。请耐心等待。
IEEE 标准 754-2019:
5.4.1 算术运算
― formatOf-convertFromInt(int)
― intFormatOf-convertToIntegerXXX(来源)
问题:为什么convertFromInt
和convertToIntegerXXX
被归类为算术运算而不是转换运算?
UPD。问题的原因:
C11(强调添加):
5.2.4.2.2 浮动类型的特点<float.h>
3 一个安静的 NaN在几乎所有 _arithmetic 运算中传播,而不会引发浮点异常;当作为算术操作数出现时,信号 NaN 通常会引发浮点异常。
根据 IEEE 754(2008 年和 2019 年)convertFromInt
,convertToIntegerXXX
被归类为算术运算而不是转换运算。
根据 C11(强调添加):
F.4 浮点数到整数的转换
1 ... 否则,如果浮点值是无穷大或NaN,或者如果浮点值的整数部分超出整数类型的范围,则引发''invalid''浮点异常并且结果值未指定. ...
这里NaN不是特化的,因此,我们得出结论,这里的NaN是任何 NaN。
还有C11(强调添加):
F.3 运算符和函数
<math.h> 中的 lrint 和 llrint 函数提供 IEC 60559转换... lrint 和 llrint 函数可用于实现从浮点到其他整数格式的 IEC 60559 转换。
但是,根据 IEEE 754(2008 年和 2019 年)convertFromInt
并被convertToIntegerXXX
归类为算术运算而不是转换运算。
总而言之:我很困惑。我看到了 C11 和 IEEE 754 之间的矛盾。
代码示例:
l = (long)NAN; // shall lead to raising of FE_INVALID ??
这里:
- IEEE 754 说:
convertToIntegerXXX
被归类为算术运算AND C11 说:安静的 NaN 在几乎所有算术运算中传播而不会引发浮点异常。 - C11 表示:如果浮点数为无穷大或 NaN 或浮点数的整数部分超出整数类型的范围,则引发''invalid''浮点异常`。
核心问题:会l = (long)NAN
导致提高FE_INVALID
吗?
额外问题:IEEE 754:是否被convertFromInt
错误convertToIntegerXXX
地归类为算术运算而不是被归类为转换操作?
UPD20211110:似乎 IEEE 754 确实错误地对它们进行了分类。对于l = (long)NAN
x86_64 的 clang 13.0.0 生成cvttss2si
,这会引发无效浮点异常。注意:gcc 11.2 仍然忽略#pragma STDC FENV_ACCESS
.