web-dev-qa-db-ja.com

Float.NaN == Float.NaN

この比較でなぜ「偽」になるのですか?私はソースを見て、Float.NaNは次のように定義されています

_/** 
 * A constant holding a Not-a-Number (NaN) value of type
 * <code>float</code>.  It is equivalent to the value returned by
 * <code>Float.intBitsToFloat(0x7fc00000)</code>.
 */
public static final float NaN = 0.0f / 0.0f;
_

編集:驚くべきことに、私がこれを行うと:

_System.out.println("FC " + (Float.compare(Float.NaN, Float.NaN)));
_

_0_が得られます。したがって、Float.compare()は、NaN isはそれ自体と等しいと考えています!

28
shrini1000

JavaはIEEE_754浮動小数点標準を実装しているため、NaNとの比較でfalseが返されることが保証されます(trueを返す!=を除く)

つまり、通常の方法では浮動小数点数がNaNであるかどうかを確認できないため、両方の数値をintとして再解釈して比較するか、より賢い解決策を使用できます。

def isNan(val):
     return val != val
35
Voo

使用する Float.isNaN NaN値をチェックします。

63
pencil

私が言う必要があるのは Wikipedia NaNについて だけです。

かなりはっきりと書かれています。興味深いのは、共通標準の浮動小数点NaNがNaNを次のように表現していることです。

s111 1111 1xxx xxxx xxxx xxxx xxxx xxxx

Sは符号(負または正)、1は指数、xはペイロードと見なされます。

ペイロードを見ると、NaNはどのNaNとも等しくありません。また、ペイロードのこれらの情報が開発者にとって興味深い可能性があることはまれです(たとえば、複素数)。

もう1つは、標準でシグナリングと非常にNaNがあることです。シグナルNaN(sNaN)は、例外のように反応を起こすNaNを意味します。方程式に問題があることを大声で言うために使用する必要があります。クワイエットNaN(qNaN)は、暗黙的に渡されるNaNです。

シグナルを作成したsNaNはqNaNに変換され、後続の操作でシグナルが生成されなくなります。一部のシステムでは、NaN ^ 0 = 1が成り立つ定数としてi ^ 0 = 1を定義しています。したがって、人々がNaNで計算する場合があります。

したがって、最終的に私はこれを使用します:qNaN!= sNaNこれは内部的なものであり、ユーザーが監視することはできません(確認できません)。支払いと記号を混ぜ合わせます(はい、あなたは負と正のNaNを持つことができます)そして私には常にNaNを返すように見えます! NaNの不平等について再び。そのような良い基準を私たちに与えてくれたその思慮深い人々を称賛してください!

ところで:Javaは、ペイロードが0の正のNaNを使用します(すべてのxはゼロです)。

0
Martin Kersten