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上给出的列表:
see below似乎维基百科上定义的严格的弱排序公理明确地提出了可能的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)
那么标准定义的不是严格的弱排序,或者 - 更可能确实 - 我在这里错过了什么?
严格的弱排序要求存在强排序的等价类.IEEE754不是这样.
问题不在于存在多个NaN值彼此相等,而是整个NaN类相对于实线是无序的.
违反(4.2)会导致您从维基百科引用的第四个项目符号中的测试也失败(让我们y成为NaN).
对于严格弱排序中允许的不可比性的示例,请考虑符号幅度整数.然后:
-4 <-3 <-2 <-1 <{ - 0,+ 0} <+1 <+2 <+3 <+4
既不是-0 < +0也不+0 < -0是真的,所以排序很弱.但是由这些等价值形成的阶级对所有其他阶段都是有序的.
| 归档时间: |
|
| 查看次数: |
247 次 |
| 最近记录: |