【问题标题】:Are HAS_SUBNORM and __STDC_IEC_559__ dependent?HAS_SUBNORM 和 __STDC_IEC_559__ 是否依赖?
【发布时间】:2021-09-14 06:08:54
【问题描述】:

HAS_SUBNORM__STDC_IEC_559__ 是否依赖?例如:

  • 如果__STDC_IEC_559__ 为1,则HAS_SUBNORM 为1。
  • 如果HAS_SUBNORM 为0,则__STDC_IEC_559__ 不为1。

【问题讨论】:

  • C 标准的第 F 部分有几个句子以“支持非正常结果时”开头(参考:F.10.7.1/2、F.10.7.2/2、F.10.7.3 /2),这表明它们是独立的。
  • 谢谢!这意味着__STDC_IEC_559__ is 1 != conformance to IEEE 754。困惑。

标签: c floating-point c11 standards-compliance c17


【解决方案1】:

HAS_SUBNORM__STDC_IEC_559__ 是否依赖?

我建议不要。
__STDC_IEC_559__ == 1xxx_HAS_SUBNORM != 1 可能。

C17 附录 F 指定符合 __STDC_IEC_559__ 所需的内容:“定义 __STDC_IEC_559__ 的实现应符合本附件中的规范。”

附录 F 没有指定对次正规的支持,甚至在 2 个地方描述了函数:

...当支持次正规结果时,返回值是精确的,与当前舍入方向模式无关。 C17dr § F.10.7.2&3 2.

这至少意味着这些功能不需要低于标准的支持。另见@Ian Abbott


尼特:

"__STDC_IEC_559__ 不是 1。"更像是“__STDC_IEC_559__ not defined”,而不是“if defined and not 1”。

【讨论】:

  • 谢谢!因此,__STDC_IEC_559__ is 1 表示实现确实符合附件 F 中的规范。这意味着 __STDC_IEC_559__ is 1 != conformance to IEEE 754。惊讶。意外。使困惑。你能对此发表评论吗?关于“__STDC_IEC_559__ is not 1”:C11 附件 F 不需要对 1 的定义。(在 C11 中,为什么与 __STDC__ 的逻辑不一致,如果实现符合要求,则定义为 1? ) 但是,这在 C17..C2x (N2479) 中有所改变:如果 __STDC_IEC_559__1 ,则实现符合附录 F 中的规范。
  • @pmor C17 (N2176) 具有“__STDC_IEC_559__ 整数常量 1,旨在表明符合附件 F(IEC 60559 浮点运算)中的规范。”和“定义__STDC_IEC_559__ 的实现应符合本附件中的规范。”和“未定义__STDC_IEC_559__ 的实现不需要符合这些规范”。意图当然是如果__STDC_IEC_559__ 定义为1,则符合附件F,否则未定义。定义而不是 1 是模糊的。
  • @pmor 有一个 很多 符合 IEEE 754。以至于给定的编译器可能选择不定义 __STDC_IEC_559__,即使它 100% 符合 IEEE 754 和附件 F。证明附件 F 的一致性并维护它可能不值得。我希望编译器将__STDC_IEC_559__ 定义为除了 100% 符合。此外,某些一致性是昂贵的,因此编译器将为接近一致性的更快代码提供选项。如果你真的想要 100.0% 的一致性,你的编译器可能需要一些认证,否则它可能只是接近。
  • @pmor IMO,最好编写允许稍微不符合要求的实现的代码,因为我认为 100% 的合规性并不值得(考虑到减少选项)。
  • "all but 100%":让我想起了在 LSAT 上获得 180 分的情况,这非常罕见。或者“为什么你不能得到 100?没有 100”。
猜你喜欢
  • 2012-11-04
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
  • 2018-07-22
  • 2023-03-23
  • 2019-11-05
  • 1970-01-01
相关资源
最近更新 更多