.NETクイズ 回答編

.NETクイズの答え。

問題再掲

以下の結果を予想してください。

using System;

class Program
{
  static void Main()
  {
    Console.WriteLine( double.NaN == double.NaN );
    Console.WriteLine( double.NaN.Equals( double.NaN ) );
  }
}

こたえ

False
True

解説

NaN かどうか調べるには IsNaN を使うべきです。それなのにクイズにしてしまってスミマセン。
この問題は「JIS X 3016 共通言語基盤(CLI)」 8.2.5.2 の備考からでした。引用します。

二つの浮動小数点数 NaN は、IEC 60559:1989 によって、常に等価ではないとして比較されると定義されているが、System.Object.Equals についての契約は、上書きが同値演算子のための要件を満足しなければならないことを要求する。そのために、System.Double.Equals 及び System.Single.Equals は、二つの NaN を比較したとき、True を返す。その一方で、等価演算子は、IEC 60559:1989 が要求するとおり、NaN の比較で False を返す。

等価演算子と同値演算子を別モノと言ってます。この直前に説明がありました。「同 8.2.5 値の同一性及び等価性」から引用。

8.2.5 値の同一性及び等価性
値のすべての対で定義される二つの2項演算子、同一性演算子及び等価演算子、が存在する。これらは真理値の結果を返す。これらの演算は、数学的には、両方とも同値演算子になる。

う〜ん、これだと同一性演算子と等価演算子の結果が違う場合、同値演算子はどっち?ってことがわからないけど、先の答えのようになるってことでいいや。なんか、等価と同値という言葉を違う意味で使うって時点でもうついていけない…。