基于非IEEE 754的C编译器的浮点数:这样的C编译器符合C标准吗?

4
如果 C 编译器的浮点数实现是非 IEEE 754 标准的,那么这样的 C 编译器是否符合 C 标准?

1
你不应该在这种形式中提出问题:“如果编译器执行X,那么它是否符合标准?” 你真正想问的问题是“如果编译器执行X,那么这种行为是否不符合标准?” 这是因为编译器可以执行X,这本身是符合标准的,但编译器也可能执行Y,这是不符合标准的。例如,编译器可能在其所有浮点行为上完全符合C标准,但在源代码包含名为foobar的例程时失败。 - Eric Postpischil
@EricPostpischil:这是把龟毛推到了极致!在我看来,问题很清楚,而且写得很好。 - TonyK
@TonyK:这位海报已经写了几十个有关C标准和IEEE 754的学究式问题。那就是他们在寻求的答案。 - Eric Postpischil
@EricPostpischil:哈哈!是的,你说得对。对此我感到抱歉。 - TonyK
2个回答

3
如果实现声明符合IEEE 754 / IEC 60559(定义了__STDC_IEC_559__),则必须这样做,但C标准并不要求如此。C11 footnote 356:“不定义__STDC_IEC_559__的实现不需要遵守这些规范。”例如,C不需要二进制浮点数-最小要求包括任何浮点类型的范围至少为1e-37到1e37。

2
C标准而言,浮点数的表示方法是未指定的
第6.2.6节涵盖了类型的表示。特别地,6.2.6.1p1声明:
“除了本分语句所述的情况外,所有类型的表示都是未指定的。”
在第6.2.6节中没有提到浮点类型。因此,实现可以使用任何它选择的表示方法,并且不需要记录该决策。

这意味着浮点数的位级表示未指定。然而,浮点类型的特征在5.2.4.2.2中有所规定。浮点类型必须有效地表示数字,即一个符号和一定数量的数字在一个固定的基数下乘以基数的指数,并带有固定的极限,可选地加上无穷大和NaN。 - Eric Postpischil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接