IEEE754浮动在多大程度上满足LessThanComparable
Inhowfar do IEEE754 floats satisfy LessThanComparable?
TL;DR包含 NaN
的IEEE754浮点值满足LessThanComparable
吗?
具体来说,问题"为什么发布/调试对std::min有不同的结果?"让我查找LessThanComparable
:
该类型必须与<操作者和结果应有标准语义。>
需求类型T满足LessThanComparable,如果
给定
- a、b、c,类型为T或const T的表达式
下列表达式必须是有效的,并且指定了它们影响
用下列性质建立严格弱序关系(…)
我在标准中仔细检查了一下,看起来基本是一样的,我看了一下维基百科的严格弱排序。
一些人认为包含NaN的IEEE浮点值集不满足这个概念:任何与NaN在任何一边的比较都会产生错误,但是我一直在看定义,并且对我来说根本不明显NaN
的存在是否打破了严格的弱排序:
维基百科给出的列表:
- 对于S中的所有x, x
- 对于S中所有x, y, if x <那么就不是Y><x(不对称)。
see below
>那么就不是Y> - 对于S中所有的x, y, z, if x
<z(传递性)。> - 对于S中的所有x, y, z,如果x与y不可比较(x
<x成立),且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)
那么标准定义的不是严格弱排序吗,或者——更有可能——我在这里遗漏了什么吗?
严格弱排序要求存在强排序等价类。而IEEE754则不是这样。
问题不在于存在多个相互等价的NaN值,而在于整个NaN类相对于实线是无序的。
违反(4.2)会导致您从维基百科引用的第四个要点中的测试也失败(假设y
是NaN)。
对于一个在严格弱排序中允许的不可比较的例子,考虑符号大小整数。然后:
4 & lt;3 & lt;2 & lt;1 & lt;{-0, +0} <+ 1 & lt;+ 2 & lt;+ 3 & lt;+ 4
-0 < +0
和+0 < -0
都不为真,所以排序是弱的。但是,由这些等价值构成的类相对于其他所有类是强有序的。
IEEE754浮点值包括NaN 不满足 LessThanComparable。
如果你从维基百科中取出第4点,并将uncomparable替换为equiv
,你就会得到与std相同的条件。
这里有一个很好的答案,基本上回答了我对c++的所有疑问。:
https://stackoverflow.com/a/8097097/321013它甚至从std中引用了与我在上面问题末尾所做的相同的段落:
如果我们定义equiv(a, b)为!comp(a, b) &&比较(b, a),然后要求是比较和相等都是传递关系…等效(a, b) &&Equiv (b, c)暗含Equiv (a, c)a = 0.0, b = NaN, c = 1.0, comp =
std::less<double>()
它还解决了一个有趣的问题。要求:
我一直认为有点奇怪的是标准按键类型表示需求,而不是按添加到容器中的实际键值。我相信你可以选择将此阅读为不保证
map<double, int>
具有如果实现支持nan,则定义行为,无论您是否实际向实例添加NaN,
你似乎在说维基百科的定义允许nan,但标准的定义不允许。我不认为你是对的。来自维基百科的定义:
对于S中的所有x, y, z,如果x与y不可比较(x
<X成立),且y与z不可比较,则X与z不可比较(不可比较的及物性)。>
假设x为3.0,y为NaN, z为7.0。X与y无法比较,y与z无法比较。X与z 不不可比较。
- 即使没有满足他们的条件,我也无法通过一些 do-while 循环
- 如果仍然不满足要求,如何使 if 语句重复?
- 如何反复调用函数直到满足模拟?
- 如何有效地操作满足给定谓词的向量中的所有项目?
- 具有不满足严格弱排序的值的 C++ 顺序范围
- 调用不在基类中的派生类函数而不进行动态强制转换,以最大程度地提高性能
- C++ 即使不满足条件,循环也会终止
- C++函数,它将数组、谓词和运算符作为参数,并将运算符应用于满足谓词的数组元素
- 有没有办法在循环中的条件至少满足一次时运行语句?
- 计算另一个图像像素满足条件的像素值的平均值
- 查找满足浮点不等式方程的最小整数
- std::原子到什么程度?
- 现代C++在多大程度上消除了对设计模式的需求?
- 如何制作一个满足SWIG中接口的python类
- 当满足条件时,While循环未结束
- 一个有效的图算法,满足以下条件
- 如何在满足常量表达式的同时将整数传递给指针,传递给 std::array<double、integer>?
- Craps游戏在循环不满足退出条件时执行
- if语句中满足的条件的索引
- IEEE754浮动在多大程度上满足LessThanComparable