0

返された単一の配列を期待される結果と比較するいくつかの単体テストをデバッグしているときに、これに遭遇しました。

System.Single.NaN == System.Single.Nan;

単体テストはtrueを期待していましたが、これはfalseと評価されます。シングルの他の静的メソッドがtrueを返すのに、なぜこれがfalseと評価されるのですか?NaNは定数値ではありませんか?

System.Single.MaxValue == System.Single.MaxValue;
System.Single.Epsilon == System.Single.Epsilon;
null == null;

http://msdn.microsoft.com/en-us/library/system.single.nan.aspxは、次のように述べています。「2つのNaN値は互いに等しくないと見なされます。」しかし、この質問は、なぜこれが何よりも多いのかという好奇心から外れています。

4

3 に答える 3

5

IEEE 754標準(floatおよびに使用されるものdouble)がそう言っているからです。

ウィキを引用するには

NaNとの比較では、それ自体と比較した場合でも、常に順序付けられていない結果が返されます。比較述語はシグナリングまたは非シグナリングのいずれかであり、シグナリングバージョンはそのような比較の無効な例外を通知します。等式および不等式の述語はシグナリングではないため、falseを返すx = xを使用して、xが静かなNaNであるかどうかをテストできます。他の標準比較述語は、NaNオペランドを受信した場合、すべてシグナリングされます。標準は、これらの他の述語の非シグナリングバージョンも提供します。述語isNaN(x)は、値がNaNであるかどうかを判別し、xがシグナリングNaNであっても、例外を通知することはありません。

(.NETはシグナリングNaNをサポートしておらず、おそらく非シグナリングとして扱うことに注意してください)

于 2012-07-17T08:20:59.107 に答える
1

それは正しいです。NaN == NaN は常に false です。これは、特定の変数が NaN と等しいかどうかをテストする方法です。

if(x != x) //何かをする

于 2012-07-17T08:24:37.363 に答える
0

誰かがこれについて一度尋ねましDouble.NaNた。その投稿で私が見つけた最良の答えは、「それが定義されている方法だから」でした。

あまり満足のいくものではありません、私は同意します。

于 2012-07-17T08:21:07.090 に答える