Floatには32桁の2進数があり、doubleには64桁の2進数がありますか?ドキュメントを理解するのは難しすぎました。
すべてのビットが有効数字に変換されますか?または、小数点の位置がビットの一部を占有しますか?
float:32ビット(4バイト)ここで23ビットは仮数(10進数で約7桁)に使用されます。指数には8ビットが使用されるため、浮動小数点数はこれらの8ビットを使用して小数点を右または左に「移動」できます。そうすることで、0.0000003(3×10-7)または3000000(3×107)。符号ビットとして使用される1ビットがあります。
double:64ビット(8バイト)ここで52ビットは仮数に使用されます(10進数で約16桁)。 11ビットは指数に使用され、1ビットは符号ビットです。
バイナリ(0と1のみ)を使用しているため、数値がゼロ以外の場合、仮数の1ビットは暗黙的に1(floatとdoubleの両方がこのトリックを使用します)です。
また、すべてがバイナリ(仮数と指数)であるため、通常、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
長い答え:
浮動小数点数には3つのコンポーネントがあります。
基本的に、これはsign * 2^exponent * (1 + fraction)
になります。数の「サイズ」、つまり指数は、小数部分の値をscalesだけにするため、私たちとは無関係です。 log₁₀(n)
がn
の桁数を与えることを知っているので、†log₁₀(largest_possible_fraction)
を使用して浮動小数点数の精度を決定できます。 floatの各ビットには2つの可能性が格納されるため、n
ビットの2進数には2ⁿ - 1
(合計2ⁿ
)までの数値を格納できます値の1つがゼロの場合)。ゼロは特別に表され、すべての非ゼロ数には少なくとも1つの非ゼロバイナリビットがあるため、浮動小数点数は使用できるよりも1ビット少ない分数で格納されることが判明したため、これは少し難しくなります。
これを組み合わせると、浮動小数点数の精度の桁はlog₁₀(2ⁿ)
です。ここで、n
は浮動小数点数の小数部のビット数です。 32ビットの浮動小数点数は、精度が約7.22桁の24ビットの小数部を持ち、64ビットの倍精度は、精度が約15.95の小数桁の53ビットの小数部を持ちます。
浮動小数点の精度の詳細については、 machine epsilon の概念についてお読みください。
†少なくともn ≥ 1
の場合—他の数値の場合、式は⌊log₁₀(|n|)⌋ + 1
のようになります。
‡「この規則は、リーディングビット規則、暗黙ビット規則、または隠しビット規則と呼ばれます。」( Wikipedia )
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は無限の数字です。
したがって、general:有効数字を気にする場合は、浮動小数点数を使用しないでください。計算、e、aを含む金額の場合、BigDecimalを使用するのが最適です。
physics浮動小数点doublesが適切であり、floatsはほとんどありません。さらに、プロセッサの浮動小数点部分であるFPUは、内部でもう少し精度を使用することさえできます。
浮動小数点数は、m * b ^ e
のような指数形式を使用してエンコードされます。つまり、整数とはまったく異なります。あなたが尋ねる質問は、 固定小数点数 のコンテキストで意味があります。多数の 固定小数点演算ライブラリ が利用可能です。
浮動小数点演算について:10進数の桁数は、表示と番号体系によって異なります。たとえば、10進数では有限の表現ではなく、2進数では1であり、その逆も同様である周期的な数字(0.33333
)があります。
また、value + 1
はvalue + 1
を使用してエンコードできないため、特定のポイントまでの浮動小数点数には1より大きい差があります。つまり、m * b ^ e
はvalue
を生成します。 _、ここでm
、b
およびe
は長さが固定されています。同じことは、1より小さい値でも起こります。つまり、可能なすべてのコードポイントが同じ距離を持っているわけではありません。
このため、n
10進数の数字がすべてIEEEエンコードを持っているわけではないため、固定小数点数のように正確にn
桁の精度はありません。
次に読む必要のあるほぼ必須のドキュメントがあり、浮動小数点数について説明しています。 すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと 。
Float.intBitsToFloat
と Double.longBitsToDouble
を見てください。これらは、ビットが浮動小数点数にどのように対応するかを説明しています。特に、通常のfloat
のビットは次のようになります
s * 2^exp * 1.ABCDEFGHIJKLMNOPQRSTUVW
ここで、A ... Wは23ビット-0sおよび1s-バイナリの小数部を表します-sは+/- 1であり、それぞれ0または1で表され、expは符号付き8ビット整数です。