12
对于IEEE754 NaN值,所有比较返回false的理由是什么?
为什么NaN值的比较与所有其他值都不同?也就是说,与一个或两个值均为NaN的运算符==,<=,> =,<,>进行的所有比较均返回false,这与所有其他值的行为相反。 我想这以某种方式简化了数值计算,但是我找不到明确陈述的理由,甚至在Kahan撰写的关于IEEE 754状态的讲义中也没有详细讨论其他设计决策。 在进行简单的数据处理时,这种异常行为会引起麻烦。例如,当在C程序中对带有某些实值字段的记录列表进行排序时,我需要编写额外的代码以将NaN作为最大元素来处理,否则排序算法可能会变得混乱。 编辑: 到目前为止,所有答案都表明,比较NaN毫无意义。 我同意,但这并不意味着正确答案是错误的,而是一个非布尔值(NaB),幸运的是不存在。 因此,在我看来,选择比较返回真还是假是任意的,并且对于一般数据处理,如果遵循通常的规律(反射性为==,三分法为<,==,>),则最好避免数据结构,这将是有利的依靠这些法律变得混乱。 因此,我要求打破这些法律的某些具体优势,而不仅仅是哲学推理。 编辑2: 我想我现在明白为什么将NaN设为最大值会是个坏主意,它将使上限计算变得混乱。 NaN!= NaN可能需要避免检测诸如 while (x != oldX) { oldX = x; x = better_approximation(x); } 但是最好通过比较绝对差和较小的限制来写出。因此恕我直言,这对于打破NaN的反射率是一个相对较弱的论点。