相关的IEEE标准定义了一个数字常量NaN(不是数字),并规定NaN应该比较为不等于它自己.这是为什么?
我熟悉的所有语言都实现了这个规则.但它经常会导致严重的问题,例如当NaN存储在容器中时,NaN存在于正在排序的数据中等时的意外行为等.更不用说,绝大多数程序员都希望任何对象都等于自身(在他们了解NaN之前,令人惊讶的是他们增加了错误和混乱.
IEEE标准经过深思熟虑,因此我确信NaN的比较与其本身相同是很糟糕的.我只是想不通它是什么.
从C++,是min
和max
优选超过fmin
和fmax
?为了比较两个整数,它们是否提供基本相同的功能?
您是倾向于使用这些功能集中的一个还是更喜欢自己编写(可能是为了提高效率,可移植性,灵活性等)?
笔记:
提前致谢!
我们有一个算法库对可能是NaN的数字进行大量std::min
/ std::max
操作.考虑这篇文章:为什么Release/Debug对std :: min有不同的结果?,我们意识到它显然是不安全的.
有没有办法阻止开发人员使用std::min
/ std::max
?
我们的代码使用VS2015和g ++编译.我们的所有源文件都包含一个公共头文件(通过/FI
VS2015和-include
g ++的选项).是否有任何代码/编译指示可以放在这里使任何cpp文件使用std::min
或std::max
无法编译?
顺便说一下,使用此功能的遗留代码(如STL标头)不应受到影响.只有我们编写的代码才会受到影响.
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) …