Javaが浮動小数点演算の実装にIEEE 754規格を使用している場合、私は興味があります。
IEEE-754は、複数浮動小数点型の基準を定義します。何年もの間、彼らはすべてバイナリ浮動小数点でした。これは、Javaのfloat
とdouble
が次のようなものです。float
は、32ビットIEEE-754バイナリ浮動小数点値(標準ではbinary32
と呼ばれるもの)です。 double
は64ビットのものです(標準ではbinary64
と呼んでいます)。これらのバイナリ浮動小数点数は、コンピュータの計算に非常に効率的ですが、バイナリで動作し、10進数で動作するため、いくつかの期待ミスマッチがあります。たとえば0.1
はdouble
に正確に格納することはできず、0.1 + 0.2
のような奇妙なものは0.30000000000000004
となります。詳細は、Is floating point math broken?を参照してください。たとえば、財務計算には適していません。
BigDecimal
は、10進数浮動小数点を実装するJavaクラスです。 double
を使用するよりもはるかに遅いですが、結果は小数点の期待に合っています(たとえば、0.1 + 0.2
は0.3
になります)。
IEEE-754の2008年版には、重要な新しい形式、特にdecimal32
,decimal64
、およびdecimal128
が追加されています。これらは小数点以下は浮動小数点なので、私たちと同じように動作します。 0.1
は、decimal64
に正確に格納することができます。 0.1 + 0.2
は、decimal64
で0.3
です。しかし、私が知る限り、それらはあなたの質問に本当に関連していません。
BigDecimal
はIEEE-754 2008(ある程度の差異)よりも前に、独自のセマンティクスを定義しています。
また、IEEE 754規格をMathクラスで使用している点は何ですか? 、
JDK9は、IEEE-754 2008仕様(fused multiply-addを行うなどfma
、)で定義されたことを行うMath
に新しい操作を追加し、それはIEEE-754 2008仕様を参照して、これらの操作を定義します明確にするために。
より読み出し:
Nitpick:二進浮動小数点型に加えて、小数を定義する、IEEE 754-2008、約アスカー問い合わせる浮動'0.1'を正確に表すことができる' decimal64'と 'decimal128'のポイントタイプです。 – njuffa
@njuffa:良い点、私は質問の引用符でそれを逃した。そして、ブラインドリンクは、2008年の標準について語っているJDK9の仕様です。それは答えを完全に変えます。 –
@njuffa:修正しました。もう一度指摘してくれてありがとうございます。 –