【问题标题】:C compiler's FP based on non-IEEE 754: is such C compiler C standard compliant?基于非 IEEE 754 的 C 编译器的 FP:这样的 C 编译器符合 C 标准吗?
【发布时间】:2021-03-19 06:00:12
【问题描述】:

如果 C 编译器的 FP 是基于非 IEEE 754 的,那么这种 C 编译器是否符合 C 标准?

【问题讨论】:

  • 您不应该以这种形式提出问题:如果编译器执行 X,那么它是否兼容?您要问的实际问题是“如果编译器执行 X,那么该特定行为是否不合规?”这是因为编译器可以做 X,它本身是合规的,但编译器也可能做 Y,这是不合规的。例如,编译器的所有浮点行为可能完全符合 C 标准,但只要源代码包含名为 foobar 的例程,编译器就会失败。
  • @EricPostpischil:这让学究气到了极限!在我看来,这个问题很清楚而且写得很好。
  • @TonyK:这张海报写了几十个关于 C 标准和 IEEE 754 的迂腐问题。这就是他们所寻求的。
  • @EricPostpischil:哈哈!你是对的。对此感到抱歉。

标签: c floating-point ieee-754 standards-compliance


【解决方案1】:

C standard 而言,用于浮点数的表示是未指定

第 6.2.6 节介绍了类型的表示。特别是,6.2.6.1p1 指出:

所有类型的表示均未指定,除非本小节中另有说明。

在 6.2.6 节中没有提到浮点类型。因此,实现可以使用它选择的任何表示,并且不需要记录该决定。

【讨论】:

  • 这意味着没有指定浮点数的位级表示。但是,浮点类型的特性在 5.2.4.2.2 中指定。浮点类型必须将有效数字表示为符号和固定基数中的固定位数乘以具有固定限制的指数,可选择加上无穷大和 NaN。
【解决方案2】:

如果实现表明它符合 IEEE 754/IEC 60559(定义了__STDC_IEC_559__),它必须这样做。

但 C 标准并不要求这样做。 C11 footnote 356:

  1. 未定义 __STDC_IEC_559__ 的实现不需要符合这些规范。

C 不需要例如二进制浮点 - 最低要求包括例如任何浮点类型必须具有至少 1e-37 到 1e37 的范围

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多