IEEE754浮动在多大程度上满足LessThanComparable

Inhowfar do IEEE754 floats satisfy LessThanComparable?

本文关键字:程度 满足 LessThanComparable IEEE754      更新时间:2023-10-16

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>
  • 对于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 不可比较。