有没有任何浮点比较"异常"?

mwf*_*ley 6 floating-point comparison

如果我比较两个浮点数,是否存在a>=b不等于b<=a!(a<b),或者哪里a==b不等于b==a!(a!=b)

换句话说:比较总是"对称的",这样我可以通过交换操作数和镜像操作符来获得相同的结果吗?它们总是"可否定的",这样否定运算符(例如>to <=)等同于对结果应用逻辑NOT(!)?

Ste*_*non 7

假设IEEE-754浮点:

  • a >= b总是相当于b <= a.*
  • a >= b相当于!(a < b),除非一个或两个ab为NaN.
  • a == b总是相当于b == a.*
  • a == b相当于!(a != b),除非一个或两个ab为NaN.

更一般地说:三分法不适用于浮点数.相反,相关财产包含[IEEE-754(1985)§5.7]:

四种相互排斥的关系是可能的:小于,等于,大于和无序.当至少一个操作数是NaN时,出现最后一种情况.每个NaN都应该将无序与包括其自身在内的所有东西进行比较.

请注意,这实际上并不是一个"异常",而是因为在可能的情况下尝试保持与实际算术的一致性的方式将算法扩展为关闭.

[*]在抽象的IEEE-754算术中是真的.在实际使用中,由于以扩展精度进行计算(MSVC,我正在看着你),一些编译器可能会在极少数情况下导致这种情况被违反.现在,英特尔架构上的大多数浮点计算都是在SSE而不是x87上完成的,这不是一个问题(无论如何,从IEEE-754的角度来看,它始终是一个错误).