【发布时间】:2017-02-19 09:02:35
【问题描述】:
TL;DR包括NaN的IEEE754浮点值是否满足LessThanComparable?
具体来说,问题“Why does Release/Debug have a different result for std::min?”让我查找LessThanComparable:
类型必须与
要求
类型 T 满足 LessThanComparable if
给定
- a、b 和 c,T 或 const T 类型的表达式
以下表达式必须有效并指定 效果
使用以下属性建立strict weak ordering 关系 (...)
我在the standard 中仔细检查了它,似乎那里的状态基本相同,我查看了严格弱排序的维基百科定义。
Some think 包含 NaN 的 IEEE 浮点值集确实不满足这个概念:任何与 NaN 的比较总是会产生错误,但是我一直在查看定义,根本不NaN 的存在是否会破坏strict weak ordering:
对于维基百科给出的列表:
- 对于 S 中的所有 x,x
- 对于 S 中的所有 x、y,如果 x see below
- 对于 S 中的所有 x、y、z,如果 x
- 对于 S 中的所有 x、y、z,如果 x 与 y 不可比(x
似乎 Wikipedia 上定义的严格弱排序公理明确指出了可能的 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)
那么标准定义的不是严格的弱排序,或者——更可能是——我在这里遗漏了什么?
【问题讨论】:
-
相关:LWG issue 1016.
标签: c++ floating-point language-lawyer ieee-754