Inhowfar做IEEE754浮标满足LessThanComparable吗?

Mar*_* Ba 5 c++ floating-point ieee-754 language-lawyer

TL; DR执行IEEE754浮点值,包括 NaN满足LessThanComparable

具体来说,问题" 为什么Release/Debug对std :: min有不同的结果? "让我抬起头来LessThanComparable:

该类型必须与<运算符一起使用,结果应该具有标准语义.

要求

类型T满足LessThanComparable if

特定

  • a,b和c,类型T或const T的表达式

以下表达式必须有效并具有指定的效果

与以下属性建立严格的弱排序关系(...)

我在标准中对它进行双重检查,似乎它在那里基本相同,并且我查看了严格弱序的维基百科def .

有些人认为这是包括楠组IEEE浮点瓦莱斯的并不能满足这一概念:与南两边的任何比较将始终产生错误,我一直在寻找的定义,它是不是在所有对我是否明显NaN中断的严格弱顺序的存在:

对于Wikipedia上给出的列表:

  • 对于S中的所有x,不是x <x(反射性)的情况.
  • 对于S中的所有x,y,如果x <y则不是y <x(不对称)的情况. see below
  • 对于S中的所有x,y,z,如果x <y且y <z则x <z(传递性).
  • 对于S中的所有x,y,z,如果x与y无法比较(x <y和y <x hold),并且y与z无法比较,则x与z无法比较(无法比较的传递性).

似乎维基百科上定义的严格的弱排序公理明确地提出了可能的incomparable价值观:NaN似乎是一个很好的候选者?

另一方面,标准说:(25.5/4)

如果我们定义equiv(a, b)!comp(a, b) && !comp(b, a),那么要求是comp和equiv都是传递关系:

(4.1) - comp(a, b) && comp(b, c)暗示comp(a, c)

(4.2) - equiv(a, b) && equiv(b, c)暗示equiv(a, c)

有了这些定义,equiv(x, NaN)总是true(因为!comp(a, NaN)==true !comp(Nan, a)==true:与Nan的比较产生错误,否定然后产生真)

但显然(4.2)不满意,例如:

 equiv(3.0, NaN) && equiv(NaN, 7.0) **does not** imply equiv(3.0, 7.0)
Run Code Online (Sandbox Code Playgroud)

那么标准定义的不是严格的弱排序,或者 - 更可能确实 - 我在这里错过了什么?

Ben*_*igt 8

严格的弱排序要求存在强排序的等价类.IEEE754不是这样.

问题不在于存在多个NaN值彼此相等,而是整个NaN类相对于实线是无序的.

违反(4.2)会导致您从维基百科引用的第四个项目符号中的测试也失败(让我们y成为NaN).


对于严格弱排序中允许的不可比性的示例,请考虑符号幅度整数.然后:

-4 <-3 <-2 <-1 <{ - 0,+ 0} <+1 <+2 <+3 <+4

既不是-0 < +0也不+0 < -0是真的,所以排序很弱.但是由这些等价值形成的阶级对所有其他阶段都是有序的.