2

注意:了解 IEEE 754。请耐心等待。

IEEE 标准 754-2019:

5.4.1 算术运算

― formatOf-convertFromInt(int)

― intFormatOf-convertToIntegerXXX(来源)

问题:为什么convertFromIntconvertToIntegerXXX被归类为算术运算而不是转换运算

UPD。问题的原因:

C11(强调添加):

5.2.4.2.2 浮动类型的特点<float.h>

3 一个安静的 NaN在几乎所有 _arithmetic 运算中传播,而不会引发浮点异常;当作为算术操作数出现时,信号 NaN 通常会引发浮点异常。

根据 IEEE 754(2008 年和 2019 年)convertFromIntconvertToIntegerXXX被归类为算术运算而不是转换运算

根据 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 ??

这里:

  1. IEEE 754 说:convertToIntegerXXX被归类为算术运算AND C11 说:安静的 NaN 在几乎所有算术运算中传播而不会引发浮点异常
  2. C11 表示:如果浮点数为无穷大或 NaN 或浮点数的整数部分超出整数类型的范围,则引发''invalid''浮点异常`。

核心问题:会l = (long)NAN导致提高FE_INVALID吗?

额外问题:IEEE 754:是否被convertFromInt错误convertToIntegerXXX地归类为算术运算而不是被归类为转换操作

UPD20211110:似乎 IEEE 754 确实错误地对它们进行了分类。对于l = (long)NANx86_64 的 clang 13.0.0 生成cvttss2si,这会引发无效浮点异常。注意:gcc 11.2 仍然忽略#pragma STDC FENV_ACCESS.

4

0 回答 0