web-dev-qa-db-ja.com

フロートまたはダブルのNaNおよびInfinityはどのようにメモリに保存されますか?

私が理解しているように、Javaは、次のプロパティを持つ浮動小数点数を32ビット整数としてメモリに保存します。

  • 最初のビットは、符号を決定するために使用されます
  • 次の8ビットは指数を表します
  • 最後の23ビットは、分数を格納するために使用されます

これにより、次の3つの特別な場合に予備ビットが残りません。

  • ナン
  • 正の無限大
  • 負の無限大

これらの1つを格納するために負の0を使用できると推測できます。

これらは実際にメモリ内でどのように表されますか?

39
roblovelock

Javaは、浮動小数点数が IEEE 754 標準に従うことを指定しています。

これは保存方法です:

  • ビット0:符号ビット
  • ビット1から11:指数
  • ビット12から63:小数

今、私は異なるdouble値で以下のメソッドを実行しました:

public static void print(double d){
    System.out.println(Long.toBinaryString(Double.doubleToRawLongBits(d)));
}

私はこれらの値で実行しました:

print(Double.NaN);
print(Double.NEGATIVE_INFINITY);
print(Double.POSITIVE_INFINITY);
print(-Double.MAX_VALUE);
print(Double.MAX_VALUE);

そして、上記の値について次の出力を得ました(読みやすいようにフォーマットされています):

 NaN: 0111111111111000000000000000000000000000000000000000000000000000
-Inf: 1111111111110000000000000000000000000000000000000000000000000000
+Inf: 0111111111110000000000000000000000000000000000000000000000000000
-Max: 1111111111101111111111111111111111111111111111111111111111111111
+Max: 0111111111101111111111111111111111111111111111111111111111111111

ウィキペディアの説明 指数フィールドが全ビット1の場合、数値はInfまたはNaNのいずれかです。 Infには、仮数ゼロのすべてのビットがあります。 NaNの仮数部のビットは少なくとも1に設定されています。符号ビットはInfの通常の意味を保持しますが、NaNには意味がありません。 JavaのDouble.NaNはNaNとして解釈される特定の値ですが、2つあります53−3その他。

56
Darshan Mehta

ここ から:

Q. IEEE 754を使用して、ゼロ、無限大、NaNはどのように表されますか?

A.すべての指数ビットを1に設定することにより、正の無限大= 0x7ff0000000000000(すべての指数ビット1、符号ビット0およびすべての仮数ビット0)、負の無限= 0xfff0000000000000(すべての指数ビット1、符号ビット1およびすべての仮数ビット0) 、NaN = 0x7ff8000000000000(すべての指数ビット1、少なくとも1つの仮数ビットセット)。正のゼロ=すべてのビット0。負のゼロ=すべてのビット0。ただし、符号ビットは1です。

NAN、正の無限大および負の無限大 に関するJavadocも参照してください。

17
Rahul Tripathi

Wikipedia で説明されているように、すべてのビットが1に設定された指数は、これらの数値を識別するために使用されます。 0に設定された小数フィールドは、無限大(符号で識別される正または負)を識別するために使用され、ゼロ以外の小数フィールドはNaN値を識別します。

5
yole

JavaはIEEE 754浮動小数点を使用します。

ほとんどの数値は、仮数部が暗黙の先行1を持つ符号指数仮数形式で表されます。

指数(すべてゼロおよびすべて1)フィールドの極値は、通常の指数値として使用されません。代わりに、特殊なケースを表すために使用されます。

指数フィールドのすべてのゼロは、小さすぎて通常の形式で表現できない数値(正および負のゼロを含む)を表すために使用されます。

指数のすべては、特別な値を表すために使用されます。仮数部のすべてのビットがゼロの場合、値は正または負の無限大です(符号は符号ビットで示されます)。それ以外の場合、値はNaNです。

3
plugwash

まず最初に、メモリ内で数値がどのように浮動小数点および倍精度浮動小数点数として表されるかを学習する必要があります。

一般的な番号の形式は、1.M * 2 ^ eです。

(Mは仮数と呼ばれ、eは超過127の指数です)

浮動小数点で

MSB(最上位ビット)は符号ビットとして使用され、23〜31のビット番号はexcess-127の形式の指数値に使用され、0〜30のビット番号は仮数の格納に使用されます。

二重に

MSB(Most Significant Bit)は符号ビットとして使用され、52〜63のビット番号は超過127の形式の指数値に使用され、0〜のビット番号は仮数の格納に使用されます。

そのため、フロートまたはダブルのNaN、無限大表現を理解できるようになりました。

NaN(非数)

NaNの表現では、指数ビットはすべて1であり、仮数ビットは何でもかまいませんが、浮動小数点または小数であってもかまいません。

無限大

Infinityの表現では、すべての指数ビットは1であり、仮数ビットは0であり、浮動小数点または小数であっても問題ありません。 正の無限大は上記とまったく同じように表されますが、符号ビットは0であり、負の無限大も同様に表されますが、符号ビットは1です。

0
Rahul Dhawan