2

GCC built-ins description中,它说:

GCC 提供了 ISO C99 浮点比较宏的内置版本,可避免引发无序操作数的异常。它们与标准宏具有相同的名称(isgreater、isgreaterequal、isless、islessequal、islessgreater 和 isunordered),并带有 _内置前缀。我们打算让库实现者能够简单地将每个标准宏#define 为其内置等效项。以同样的方式,GCC 提供了 fpclassify、isfinite、isinf_sign、isnormal 和 signbit 内置函数,并以 _前缀。isinf 和 isnan 内置函数出现时带有和不带有 _内置前缀。

所以,我不太能够解析这个。浮点比较何时应该引发异常?C标准是否要求他们这样做?强制他们不要?什么都不强制?并且 - 与 的__builtin_isnan()行为不同isnan()吗?

4

1 回答 1

2

此处例外,GCC 文档指的是IEEE 754 floating point exceptions。如果你做类似的事情

a < b

并且其中一个操作数是 NaN,将引发 FP 异常(无效)。这意味着 FPU 中的某个位将保持设置,直到它被程序员明确清除。而是使用isgreater/ isless/etc。程序员可以避免触发 FP 异常。

于 2021-06-28T13:26:22.863 回答