不支持Annex F的C11实现对浮点比较运算符的异常触发有何要求?
C11非Annex F实现下浮点比较运算符的异常规则说明
- 针对不支持Annex F、也不遵循IEEE 754的C11实现,标准确实未对
==、!=、>、>=、<、<=这几类浮点比较运算符触发浮点异常的行为作出强制约束。 - 该类未做强制要求的行为不属于未定义行为,属于实现定义行为:实现需要自行明确该场景下的异常触发规则,并向开发者提供对应的文档说明。
关于<float.h>对应条款的说明:
- 5.2.4.2.2小节提到的“几乎所有算术运算”,在非IEEE 754/非Annex F实现中没有固定的覆盖范围,具体包含哪些运算由实现自行定义。
- 标准的导向性说明仅为参考:quiet NaN传播时不触发异常、signaling NaN作为操作数时通常触发异常,实现可以自主选择是否将浮点比较运算纳入上述规则的适用范围,两种选择都符合C11标准要求。
仅当实现明确声明支持Annex F时,才需要严格遵循IEEE 754的规则:此时NaN参与
>、>=、<、<=比较会触发无效操作异常,==、!=比较即使涉及NaN也不会触发异常,signaling NaN参与任何运算(含比较)都需要触发无效异常。
内容的提问来源于stack exchange,提问作者pmor
相关产品推荐
相关产品推荐

