web-dev-qa-db-ja.com

Java浮動小数点プリミティブのIEEE754標準実装はありますか?

Javaが浮動小数点演算の実装にIEEE754標準を使用しているかどうかに興味があります。 ここ ドキュメントでこの種のことを見ました:

iEEE754-2008で定義されている操作

IEEE 754の良い面は、浮動小数点演算の精度を上げることであると理解しているので、Javaでdoubleまたはfloatを使用すると、計算の前提はBigDecimalと同じになりますか? Math クラスでIEEE 754標準を使用する意味は何ですか?

11
GROX13

Javaが浮動小数点演算の実装にIEEE754標準を使用しているかどうかに興味があります。

IEEE-754は、複数浮動小数点型の標準を定義しています。何年もの間、それらはすべてbinary浮動小数点でした。これがJavaのfloatdoubleです。floatは32ビットIEEE-754バイナリ浮動小数点値です(標準では binary32 )。 doubleは64ビットのものです(標準では binary64 と呼ばれています)。これらの2進浮動小数点数は、コンピューターが計算するのに非常に効率的ですが、2進数で機能し、10進数で機能するため、期待値の不一致がいくつかあります。たとえば、0.1doubleに正確に格納することはできず、0.1 + 0.2のような奇妙な結果が0.30000000000000004になります。詳細については、 浮動小数点演算が壊れていますか? を参照してください。たとえば、財務計算には適していません。

BigDecimalはJavadecimal小数を任意の精度で実装するクラスです。これよりもはるかに低速です。 doubleを使用しますが、結果は10進数の期待に適合します(たとえば、0.1 + 0.20.3になります)。

IEEE-754の2008年版では、特に decimal32decimal64 、および decimal128)という重要な新しい形式が追加されています。 。これらはdecimal浮動小数点であるため、私たちと同じように機能します。 0.1decimal64に正確に保存できます。 0.1 + 0.20.3decimal64です。しかし、私が知る限り、それらはあなたの質問とはあまり関係がありません。

BigDecimalはIEEE-7542008よりも前から存在しているため(ある程度のマージンがあります)、独自のセマンティクスを定義しています。

そして、数学のクラスでIEEE 754標準を使用する意味は何ですか?

JDK9は、IEEE-754 2008仕様で定義されていることを実行する新しい操作をMathに追加します( fmafused multiply-addなど) )であるため、わかりやすくするために、IEEE-7542008仕様を参照してこれらの操作を定義します。

もっと読む:

14
T.J. Crowder