比较Double.NaN与自身

GET*_*Tah 38 .net c# double nan

我很难找到为什么这两个操作返回不同的值:

  1. Double.NaN == Double.NaN 回报 false
  2. Double.NaN.Equals(Double.NaN) 回报 true

我有第一部分但不是第二部分的答案而不是"为什么这两个比较返回不同的值"

Dre*_*kes 32

差异的原因很简单,如果不是很明显的话.

如果使用等于运算符==,那么您将使用IEEE测试进行相等性.

如果你正在使用这种Equals(object)方法,那么你必须保持合同object.Equals(object).实现此方法(以及相应的GetHashCode方法)时,必须维护该合同,这与IEEE行为不同.

如果Equals不支持合同,则哈希表的行为将会中断.

var map = new Dictionary<double,string>();
map[double.NaN] = "NaN";
var s = map[double.NaN];
Run Code Online (Sandbox Code Playgroud)

如果!double.NaN.Equals(double.NaN),你永远不会从字典中获得你的价值!

如果前面的句子没有意义,那么明白,散列的机制(使用Dictionary<T,U>,HashSet<T>等),同时使用object.Equals(object)object.GetHashCode()方法广泛,并且依靠自己的行为的保证.

  • 为了完整起见,这在ECMA-335 I.8.2.5.2中的注释中给出."Equality通过Equals方法在System.Object上实现.[注意:虽然IEC 60559:1989定义了两个浮点NaN,但总是比较为不等,System.Object.Equals的契约要求覆盖必须满足等价运算符的要求.因此,当比较两个NaN时,System.Double.Equals和System.Single.Equals返回True,而等于运算符返回False案例,符合IEC标准的要求.尾注]" (11认同)
  • 优秀的推理.我们没有链接到这里的引用,我们创建它们. (5认同)

Ode*_*ded 9

在备注部分的最底部Double.Equals,你会发现:

如果通过调用Equals方法测试两个Double.NaN值的相等性,则该方法返回true.但是,如果使用等于运算符测试两个NaN值的相等性,则运算符返回false.如果要确定Double的值是否不是数字(NaN),则可以选择调用IsNaN方法.

  • 这不回答问题的"原因"部分. (4认同)
  • 我想知道是否有一个理由超出_文档说so_ :) (2认同)