float には 32 の 2 進数があり、double には 64 の 2 進数がありますか? ドキュメントは難しすぎて意味がわかりませんでした。
すべてのビットが有効数字に変換されますか? または、小数点の位置が一部のビットを占めていますか?
float には 32 の 2 進数があり、double には 64 の 2 進数がありますか? ドキュメントは難しすぎて意味がわかりませんでした。
すべてのビットが有効数字に変換されますか? または、小数点の位置が一部のビットを占めていますか?
float : 32 ビット(4 バイト) で、23 ビットが仮数 (10 進数で約 7 桁) に使用されます。指数には 8 ビットが使用されるため、float はこれらの 8 ビットを使用して小数点を右または左に「移動」できます。そうすることで、仮数部に 0.0000003 (3 × 10 -7 ) または 3000000 (3 × 10 7 ) のように多数のゼロを格納することを回避できます。符号ビットとして使用される 1 ビットがあります。
double : 64 ビット(8 バイト) で、52 ビットが仮数 (10 進数で約 16 桁) に使用されます。11 ビットが指数に使用され、1 ビットが符号ビットです。
バイナリ (0 と 1 のみ) を使用しているため、数値がゼロ以外の場合、仮数の 1 ビットは暗黙的に 1 になります (float と double の両方がこのトリックを使用します)。
また、すべてが 2 進数 (仮数と指数) であるため、通常、10 進数への変換は正確ではありません。0.5、0.25、0.75、0.125 などの数値は正確に格納されますが、0.1 は格納されません。他の人が言ったように、セントを正確に格納する必要がある場合は、float や double を使用せず、int、long、BigInteger、または BigDecimal を使用してください。
ソース:
http://en.wikipedia.org/wiki/Floating_point#IEEE_754:_floating_point_in_modern_computers
Java仕様から:
浮動小数点型は float と double であり、これらは概念的に単精度 32 ビットおよび倍精度 64 ビット形式の IEEE 754 値と演算に関連付けられており、バイナリ浮動小数点演算の IEEE 標準、ANSI/IEEE で指定されています。標準 754-1985 (IEEE、ニューヨーク)。
IEEE754 の基礎を理解していないと数値を扱うのは難しいため、別のリンクを参照してください。
精度は一定ではなく、整数の場合のように数値を正確に格納するわけではないことを理解することが重要です。
例 :
double a = 0.3 - 0.1;
System.out.println(a);
版画
0.19999999999999998
任意の精度が必要な場合 (たとえば、財務目的で)、Big Decimalが必要になる場合があります。
通常の数学の答え。
浮動小数点数は、指数を表す一部のビットと、残りのほとんどが (バイナリ システムの) 数字として実装されることを理解すると、次のような状況になります。
指数が高い場合、最下位ビットが変更されると 10²³ と言うと、隣接する 2 つの識別可能な数値の間に大きな差が現れます。さらに、基数 2 の小数点により、多くの基数 10 の数値は概算しかできなくなります。1/5、1/10 は無限の数です。
したがって、一般的には、有効数字を気にする場合は浮動小数点数を使用しないでください。計算、e、a を伴う金額の場合、BigDecimalを使用するのが最適です。
物理演算では浮動小数点doubleで十分ですが、floatはほとんどありません。さらに、プロセッサの浮動小数点部分である FPU は、内部でもう少し精度を高めることさえできます。
浮動小数点数は、指数形式を使用してエンコードさm * b ^ e
れます。つまり、整数とはまったく異なります。あなたが尋ねる質問は、固定小数点数のコンテキストで意味があります。多数の固定小数点演算ライブラリが利用可能です。
浮動小数点演算について: 10 進数の桁数は、表示方法と数値システムによって異なります。たとえば、周期的な数 ( 0.33333
) には、10 進数では有限な表現がなく、2 進数では有限な表現があり、その逆もあります。
また、特定のポイントまでの浮動小数点数には 1 よりも大きな差があること、つまり、yield があることにも言及するvalue + 1
価値があります。1 より小さい値でも同じことが起こります。つまり、考えられるすべてのコード ポイントの距離が同じではありません。value
value + 1
m * b ^ e
m
b
e
n
このため、固定小数点数のような正確な桁数の精度はありませんn
。10 進数を含むすべての数値が IEEE エンコーディングを持っているわけではないからです。
次に、浮動小数点数を説明するほぼ必須のドキュメントがあります。これは、浮動小数点数について説明してい ます。
Float.intBitsToFloat
と を見てくださいDouble.longBitsToDouble
。これらはビットが浮動小数点数にどのように対応するかを説明しています。特に、法線のビットは次のfloat
ように見えます
s * 2^exp * 1.ABCDEFGHIJKLMNOPQRSTUVW
ここで、A...W は 23 ビット (0 と 1) で、バイナリの分数を表します。s は +/- 1 で、それぞれ 0 または 1 で表され、exp は符号付き 8 ビット整数です。