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
2進浮動小数点数は、値が2進累乗の2進整数として格納されるため、興味深い精度特性を持っています。サブ整数値(つまり、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ドキュメンテーション 浮動小数点の問題と制限 からの記事は、この問題をわかりやすい形式で説明する優れた仕事をしています。ウィキペディアにも良い記事があります。 浮動小数点 表現の背後にある数学を説明します。
From Primitives Data Types :
float:
float
データ型は、単精度の32ビットIEEE 754浮動小数点です。値の範囲はこの説明の範囲外ですが、Java Language Specification。byte
とshort
、浮動小数点数の大きな配列にメモリを保存する必要がある場合は、float
の代わりにdouble
を使用します。このデータ型は使用しないでください通貨などの正確な値の場合、代わりに Java.math.BigDecimal クラスを使用する必要があります Numbers and Strings coversBigDecimal
およびJavaプラットフォームによって提供されるその他の便利なクラス。
double
:double
データ型は、倍精度64ビットIEEE 754浮動小数点です。値の範囲はこの説明の範囲を超えていますが、Java言語仕様。10進値の場合、このデータ型は 4.2. のセクションで指定されています。上記のように、このデータ型は通貨などの正確な値には決して使用しないでください。
値の範囲については、JLSのセクション 4.2.3浮動小数点型、形式、および値 を参照してください。
もちろん、「重要な」事柄にfloatまたはdoubleを使用できます...多くのアプリケーションは、これらのデータ型を使用して数値を処理するだけです。
浮動小数点数に関するさまざまな警告のいくつかを誤解している可能性があります。たとえば、 正確な等価性と比較 などです。