Javaのfloatとdoubleの包括的範囲は何ですか?
-
22-07-2019 - |
質問
Javaでのfloatとdoubleの包括的範囲は何ですか?
精度が重要な場合にfloatまたはdoubleを使用することをお勧めしないのはなぜですか?
解決
Javaの Double
クラスには、そのタイプの最小値と最大値を含むメンバーがあります。
2^-1074 <= x <= (2-2^-52)·2^1023 // where x is the double.
Min_VALUE
および MAX_VALUE
の静的最終メンバー Double
を確認します。
(一部)丸め誤差は測定可能な(わずかな)量の計算をスローオフする可能性があるため、精度と精度が重要な場合に浮動小数点型を使用することを推奨しません。
他のヒント
Javaのプリミティブデータ型
ブール値: 1ビット。 trueとfalseのみの値を取ることができます。
バイト: 1符号付きバイト(2の補数)。 -128〜127の値をカバーします。
short: 2バイト、符号付き(2の補数)、-32,768〜32,767
int: 4バイト、符号付き(2の補数)。 -2,147,483,648〜2,147,483,647。
long: 8バイトの符号付き(2の補数)。 -9,223,372,036,854,775,808から+9,223,372,036,854,775,807までの範囲。
float: 4バイト、IEEE754。1.40129846432481707e-45〜3.40282346638528860e + 38(正または負)の範囲をカバーします。
double: 8バイトIEEE754。4.94065645841246544e-324dから1.79769313486231570e + 308d(正または負)の範囲をカバーします。
char: 2バイト、符号なし、Unicode、0〜65,535
値はバイナリの累乗されたバイナリ整数として格納されるため、バイナリ浮動小数点数には興味深い精度の特性があります。サブ整数値(つまり、0から1の間の値)を扱う場合、2の負のべき乗の「切り捨て」は、負の10の累乗とは大きく異なります。
たとえば、0.1という数値は1 x 10 -1 で表すことができますが、0.1を正確に表すことができる2を底とする指数と仮数の組み合わせはありません。 0.10000000000000001。
したがって、0.1または0.01のような値を大量に処理しているが、小さな(0.000000000000001%未満の)エラーを許容できないアプリケーションがある場合、2進浮動小数点数は使用できません。
逆に、10の累乗が「特別」ではない場合、あなたのアプリケーション(通貨の計算では10の累乗が重要ですが、物理学のほとんどのアプリケーションではそうではありません)、実際にはバイナリ浮動小数点を使用する方が良いです、それは通常少なくとも1桁速く、そしてメモリ効率がはるかに高くなります。
浮動小数点の問題と制限に関するPythonドキュメントの記事は素晴らしい仕事をしていますこの問題をわかりやすい形式で説明する。ウィキペディアには、表現の背後にある数学を説明する浮動小数点に関する優れた記事もあります。
プリミティブデータタイプから:
>
float:
float
データ型は単精度の32ビットIEEE 754です 浮動小数点。値の範囲は この議論の範囲を超えて、 セクション 4.2.3 Java言語仕様の。としてbyte
の推奨事項とともに およびshort
、float
を使用します(代わりにdouble
)メモリを節約する必要がある場合 浮動小数点の大きな配列で 数字。このデータ型は決して 次のような正確な値に使用される 通貨。そのためには、あなたがする必要があります java.math.BigDecimal を使用します 代わりにクラス。 数字と 文字列は、BigDecimal
と によって提供される他の有用なクラス Javaプラットフォーム。
double
:double
データ型は倍精度64ビットIEEE 754です 浮動小数点。値の範囲は この議論の範囲を超えて、 セクション 4.2.3 Java言語仕様の。 10進値の場合、このデータ型は 通常はデフォルトの選択。として 前述のように、このデータ型は そのような正確な値には決して使用しないでください 通貨として。
値の範囲については、セクション 4.2.3 JLSの浮動小数点型、形式、および値。
もちろん、「クリティカル」にはフロートまたはダブルを使用できます。事柄...多くのアプリケーションは、これらのデータ型を使用して数値を処理するだけです。