2016-10-28 5 views
7

Javaが浮動小数点演算を実装するためにIEEE 754標準を使用している場合、私は興味があります。 Here私はドキュメントのこの種のものを見た:私は、IEEE 754の正側がそうであればI'LL浮動小数点演算の精度を高めるためであることを理解したようJava浮動小数点プリミティブのIEEE 754標準実装はありますか?

IEEE 754-2008に定義された操作

をJavaでdoubleまたはfloatを使用すると、計算のプレシジョンはBigDecimalと同じになりますか? MathクラスでIEEE 754規格を使用している点は何ですか?

答えて

8

Javaが浮動小数点演算の実装にIEEE 754規格を使用している場合、私は興味があります。

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

BigDecimalは、10進数浮動小数点を実装するJavaクラスです。 doubleを使用するよりもはるかに遅いですが、結果は小数点の期待に合っています(たとえば、0.1 + 0.20.3になります)。

IEEE-754の2008年版には、重要な新しい形式、特にdecimal32,decimal64、およびdecimal128が追加されています。これらは小数点以下は浮動小数点なので、私たちと同じように動作します。 0.1は、decimal64に正確に格納することができます。 0.1 + 0.2は、decimal640.3です。しかし、私が知る限り、それらはあなたの質問に本当に関連していません。

BigDecimalはIEEE-754 2008(ある程度の差異)よりも前に、独自のセマンティクスを定義しています。

また、IEEE 754規格をMathクラスで使用している点は何ですか? 、

JDK9は、IEEE-754 2008仕様(fused multiply-addを行うなどfma、)で定義されたことを行うMathに新しい操作を追加し、それはIEEE-754 2008仕様を参照して、これらの操作を定義します明確にするために。

より読み出し:

+0

Nitpick:二進浮動小数点型に加えて、小数を定義する、IEEE 754-2008、約アスカー問い合わせる浮動'0.1'を正確に表すことができる' decimal64'と 'decimal128'のポイントタイプです。 – njuffa

+0

@njuffa:良い点、私は質問の引用符でそれを逃した。そして、ブラインドリンクは、2008年の標準について語っているJDK9の仕様です。それは答えを完全に変えます。 –

+0

@njuffa:修正しました。もう一度指摘してくれてありがとうございます。 –

関連する問題