4

したがって、.net ソースを逆コンパイルすると、このコードを見つけることができます

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
[SecuritySafeCritical]
[__DynamicallyInvokable]
public static unsafe bool IsNaN(double d)
{
  return (ulong) (*(long*) &d & long.MaxValue) > 9218868437227405312UL;
}

IEEE754によるとNaN != NaN

質問は簡単です:なぜそれは似ていないのですか

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
[SecuritySafeCritical]
[__DynamicallyInvokable]
public static unsafe bool IsNaN(double d)
{
  return d != d;
}

私の友人は、の実装==return !IsNan(this) && this.InnerEquals(other);

しかし、NaNの実装は、プロセッサ自体のハードウェア層でハードコーディングされています。NaNまた、ケースを個別に処理するべきではありません。


そしてもう1つ質問です。なぜそれはとてもばかげているのですか?

bool b1 = (double.NaN == double.NaN); // false
bool b2 = double.NaN.Equals(double.NaN); //true

http://ideone.com/ZSRYz1

私は実装を知っています

[__DynamicallyInvokable]
public override bool Equals(object obj)
{
  if (!(obj is double))
    return false;
  double d = (double) obj;
  if (d == this)
    return true;
  if (double.IsNaN(d))
    return double.IsNaN(this);
  else
    return false;
}

しかし、なぜだかわからない

4

2 に答える 2

4

実装者でなければ確信が持てませんが、私の推測では、設計者は NaN (SNAN) のシグナリングを検討していたようです。例外がマスクされていない場合、SNAN で等しいかどうかをテストすると、ハードウェア浮動小数点例外が発生します。

于 2013-11-07T10:02:33.260 に答える