したがって、.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
私は実装を知っています
[__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;
}
しかし、なぜだかわからない