【发布时间】:2021-05-03 19:25:50
【问题描述】:
众所周知,对于任何浮点类型的变量x != x iff(当且仅当)x 是NaN(不是数字)。或逆版本:x == x iff x 不是 NaN。那么如果使用语言的自然能力可以获得相同的结果,为什么WG14 决定定义isnan(x) (math.h)?动机是什么?更好的代码可读性?
额外问题:isnan(x) 和 x != x 之间是否存在任何功能差异?
【问题讨论】:
-
我不知道委员会的原因是什么,但对我来说,
isnan()是干净和自我记录的,而x != x,不管它根据 IEEE 的定义多么明确- 754,看起来像是今天可能会起作用但明天不会起作用的杂物。 -
@JohnKugelman 无法将比较实现为简单的按位比较 - 必须检查“此值是否为
NaN?”该检查是isnan()。如果x是NaN,则isnan()功能是定义x != x的先决条件。 -
浮点相等不是独立的处理器指令吗?编译器是否需要多条指令来实现
!=? -
@AndrewHenle:
x == 0也不能实现为简单的按位运算(否则无法识别 -0 等于 0),但我们没有iszero宏。有一个浮点比较指令可以产生所需的结果。这些都与==和isnan无关,因为它们可以用一条指令实现,也可以根据硬件要求多条指令实现。