TL;DR IEEE754浮点数值,包括NaN,是否满足LessThanComparable?
具体而言,问题“为什么Release/Debug对std::min的结果不同?”让我查找了LessThanComparable
:
我在标准文档中仔细查看了一遍,似乎基本上也是这样说的,我还查看了严格弱序的维基百科定义。该类型必须使用<运算符,并且结果应具有标准语义。
要求
如果给定类型T,则类型T满足LessThanComparable,如果
给定
- a、b和c是T或const T类型的表达式
以下表达式必须有效并具有其指定的效果
建立严格弱序关系,具有以下属性 (...)
有些人认为 包括NaN在内的IEEE浮点值集合不符合这个概念:任何一侧与NaN的比较都将始终返回false,但我一直在查看定义,对我来说是否存在NaN
并不明显是否会破坏严格弱序:
对于维基百科给出的列表:
- 对于集合S中的所有x,不成立x < x(反自反性)。
- 对于集合S中的所有x、y,如果成立x < y,则不成立y < x(非对称性)。
见下文
- 对于集合S中的所有x、y、z,如果成立x < y且y < z,则成立x < z(传递性)。
- 对于集合S中的所有x、y、z,如果x与y无法比较(既不成立x < y也不成立y < x),且y与z无法比较,则x与z无法比较(不可比较性的传递性)。
看起来,维基百科上明确定义的严格弱序公理明确指出了可能存在的不可比较
值: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的比较产生false,否定则产生true)
但很明显(4.2)不满足,例如:
equiv(3.0, NaN) && equiv(NaN, 7.0) **does not** imply equiv(3.0, 7.0)
那么标准定义的不是严格弱序,或者更可能的是我在这里漏掉了什么吗?