【问题标题】:FP: invalid operation: contradiction between C (UB) and IEEE 754 (WDB)?FP:无效操作:C (UB) 和 IEEE 754 (WDB) 之间的矛盾?
【发布时间】:2021-03-14 07:49:35
【问题描述】:

N2479 C17..C2x 工作草案 — 2020 年 2 月 5 日 ISO/IEC 9899:202x (E):

6.3.1.4 实数浮点数和整数:

1 当标准浮点类型的有限值转换为 _Bool 以外的整数类型时,小数部分被丢弃(即,该值被截断为 0)。 如果整数部分的值不能用整数类型表示,则行为未定义

IEEE 754-2019:

5.8 浮点到整数格式的转换细节:

当一个 NaN 或无限操作数不能以目标格式表示并且不能以其他方式表示时,应发出无效操作异常信号。当数字操作数将转换为目标格式范围之外的整数时,如果无法以其他方式指示这种情况,则应发出无效操作异常的信号

即C 表示行为未定义,而 IEEE 754 表示应发出无效操作异常。这意味着w.r.t。异常信号在未定义的行为 (C) 中有明确定义的行为 (IEEE 754)。 C和IEEE 754之间是否矛盾?请解释一下。

【问题讨论】:

标签: c exception language-lawyer undefined-behavior ieee-754


【解决方案1】:

我没有 C 草案 N2479,但我希望相关部分与 C 2018 正式版相比变化不大。它将“未定义的行为”定义为:

...行为,在使用不可移植或错误程序结构或错误数据时,本文档对此没有任何要求...

因此不可能与 IEEE 754 存在任何矛盾或冲突。由于 C 标准没有对“整数部分的值不能用整数类型表示”时发生的情况强加任何要求,因此 C 实现不会违反 C 标准的任何要求。实现任何行为,无论是由 IEEE 754 标准还是其他标准指定的行为。

关于问题中的这一段:

即C 表示行为未定义,而 IEEE 754 表示应发出无效操作异常信号。这意味着w.r.t。异常信号在未定义的行为 (C) 中有明确定义的行为 (IEEE 754)。 C和IEEE 754之间是否矛盾?请解释一下。

这种关于存在矛盾的断言似乎是普遍的错误信息或对未定义行为含义的错误陈述的结果。未定义的行为并不意味着该行为是狂野的、不可控制的或不可预测的。正如 C 标准所使用的,它 only 表示 C 标准是静默的。它是一种事物的缺乏,而不是一种事物。这是缺乏任何要求,而不是缺乏控制或知识的要求。当 C 标准留下空白时,其他标准和其他规范可能会填补该空白。

当 C 标准未定义行为时,该行为可能部分或全部由其他标准、编译器文档、硬件规范、其他软件、操作系统等定义。

在这种情况下,如果一个 C 实现选择同时符合 C 标准和 IEEE 754 标准,那么它可以毫无矛盾地这样做,因为实现 IEEE 754 要求的行为符合 IEEE 754 的规则并遵守规则C 标准。

【讨论】:

  • C 标准强加了一项与 IEC 559 相关的非可选要求:不符合 IEC 559 (IEC 等效于 IEE-754)描述的实现必须避免预定义宏__STDC_IEC_559__.
  • 感谢您的详细解答!
  • 为什么 C 标准没有说“行为是根据 IEEE 754 定义的”?
  • @pmor:如果 C 标准所说的行为是根据 IEEE 754 定义的,那么任何想要制作符合 C 实现的人都必须将其设计为符合 IEEE 754。这对于一些硬件。它还会限制软件。许多,可能是大多数,C 实现不符合 IEEE 754 的要求。因此,添加这样的要求将严重限制符合 C 实现的进一步开发。 C 被设计成一种可以在大量系统上运行的语言,因此它在需求、硬件需求等方面具有灵活性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
相关资源
最近更新 更多