【问题标题】:Why quiet NaN is not always quiet and may lead to raising of floating-point exceptions?为什么安静的 NaN 并不总是安静的,并且可能导致引发浮点异常?
【发布时间】:2021-06-26 16:55:46
【问题描述】:

上下文:安静的 NaN 并不总是安静的,可能会引发浮点异常。

代码示例和调用:参见QNAN passed into C standard library functions (ex. llrintf): not clear whether FP exceptions are raised or not

详情:安静的 NaN 仅在某些情况下安静:

  • 算术运算 (C11, 5.2.4.2.2, p3)
  • 表 5.3 (IEEE 754, 5.11, p4) 中的无序安静谓词
  • 等。 (您可以精确到 cmets)

问题:为什么 C 标准的创建者让安静的 NaN 并不总是安静?

【问题讨论】:

  • 这看起来像是一道考试题。你有一些可以发布的代码吗?你能找出你想要解决的现实问题吗?
  • “为什么 C 标准的创建者让安静的 NaN 并不总是安静?” --> 允许支持安静和非安静(信号)NAN 的实现。
  • @RobertHarvey 确定您要解决的实际问题:清楚地了解 C 和 IEEE 754 标准,以便开发(修复现有)C符合/兼容的编译器/标准库。但是,here 用户 Nate Eldredge 问道:您知道哪些编译器/库组合实现明确声明完全符合 ISO C11 的示例?我想我不知道任何
  • @chux-ReinstateMonica 根据 IEEE 754,表 5.3 NAN == NAN导致引发 FP 异常。 (请注意,每个 C11 宏 NAN 是安静的 NaN)。但是,根据 C11,F.4 浮点到整数转换lrintf(NAN) 将导致引发“无效”浮点异常。因此,我试图理解:为什么不同类型的 FP 操作(算术运算、比较、转换等)的行为与 w.r.t 不一致。引发 FP 异常?
  • @pmor Compliant C 不需要遵守 IEEE 754 或附录 F。这是可选的。 “未定义 STDC_IEC_559 的实现不需要符合这些规范”

标签: c floating-point nan ieee-754 c11


【解决方案1】:

为什么 C 标准的创建者让安静的 NaN 并不总是安静?

据我所知,C 标准在任何地方都没有直接或间接地指定存在使用安静 NaN 必须导致引发 FP 异常的情况。因此,标准委员会并没有让安静的 NaN 无法始终保持安静。

当然,委员会也没有要求安静 NaN 的使用绝不能引发 FP 异常,并且允许(但不要求)安静 NaN 确实导致 FP 异常的情况。但这与上一段并不矛盾。

该标准旨在支持在各种硬件上实现,为此,FP 行为的许多细节都未指定。这使得 C 可以自然地实现,就主机的本机 FP 行为而言(如果存在的话)。除其他外,C 并未指定 FP 表示,因此该标准在谈论 NaN(无论是否安静)时的含义比 IEEE 754 相同术语的含义更为笼统。

【讨论】:

  • 一个安静的 NaN 必须引发 FP 异常C11, F.4 Floating to integer conversion否则,如果浮点值是无限的或 NaN,或者如果浮点值超出整数类型的范围,则引发“无效”浮点异常,结果值未指定。因为没有指定,哪个NaN,静默或信令,可以断定any NaN。这个结论正确吗?
  • @pmor, nothing 对于选择不定义宏 __STDC_IEC_559__ 的实现,可以从附件 F 中得出结论(参见 F.1 和脚注 356)。至少一些通常提供 IEC 60559 行为的实际上并没有准确定义该宏,因为它们不完全符合该附件中的规范,或者至少不准备保证它们这样做。由于这个原因,此类实现不符合标准。
猜你喜欢
  • 2021-12-24
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 2017-04-18
  • 2015-02-25
  • 1970-01-01
相关资源
最近更新 更多