Javaが浮動小数点演算の実装にIEEE754標準を使用しているかどうかに興味があります。 ここ ドキュメントでこの種のことを見ました:
iEEE754-2008で定義されている操作
IEEE 754の良い面は、浮動小数点演算の精度を上げることであると理解しているので、Javaでdouble
またはfloat
を使用すると、計算の前提はBigDecimal
と同じになりますか? Math
クラスでIEEE 754標準を使用する意味は何ですか?
Javaが浮動小数点演算の実装にIEEE754標準を使用しているかどうかに興味があります。
IEEE-754は、複数浮動小数点型の標準を定義しています。何年もの間、それらはすべてbinary浮動小数点でした。これがJavaのfloat
とdouble
です。float
は32ビットIEEE-754バイナリ浮動小数点値です(標準では binary32
)。 double
は64ビットのものです(標準では binary64
と呼ばれています)。これらの2進浮動小数点数は、コンピューターが計算するのに非常に効率的ですが、2進数で機能し、10進数で機能するため、期待値の不一致がいくつかあります。たとえば、0.1
をdouble
に正確に格納することはできず、0.1 + 0.2
のような奇妙な結果が0.30000000000000004
になります。詳細については、 浮動小数点演算が壊れていますか? を参照してください。たとえば、財務計算には適していません。
BigDecimal
はJavadecimal小数を任意の精度で実装するクラスです。これよりもはるかに低速です。 double
を使用しますが、結果は10進数の期待に適合します(たとえば、0.1 + 0.2
は0.3
になります)。
IEEE-754の2008年版では、特に decimal32
、 decimal64
、および decimal128
)という重要な新しい形式が追加されています。 。これらはdecimal浮動小数点であるため、私たちと同じように機能します。 0.1
はdecimal64
に正確に保存できます。 0.1 + 0.2
は0.3
のdecimal64
です。しかし、私が知る限り、それらはあなたの質問とはあまり関係がありません。
BigDecimal
はIEEE-7542008よりも前から存在しているため(ある程度のマージンがあります)、独自のセマンティクスを定義しています。
そして、数学のクラスでIEEE 754標準を使用する意味は何ですか?
JDK9は、IEEE-754 2008仕様で定義されていることを実行する新しい操作をMath
に追加します( fma
、 fused multiply-addなど) )であるため、わかりやすくするために、IEEE-7542008仕様を参照してこれらの操作を定義します。
もっと読む: