2016-08-23 8 views
4

私が理解しているように、C++のlong doubleは実際には(少なくともいくつかのアーキテクチャでは)ハードウェアアーキテクチャを活用しています。 JavaのBigDecimalは十分に小さい入力に対してこれを行いますか?JavaのBigDecimalは、C++でlong doubleのようなハードウェアアーキテクチャを活用していますか?

+1

質問を明確にしてください。 BigDecimalは、任意の長い番号を保持するための構造体を記述する単なるクラスです。どのようにハードウェアアーキテクチャを使用できますか? – Andremoniy

+1

そしてあなたが知っているのは、Javaの**ハードウェア**はJava仮想マシンです。しかし、それはJITが特定の既知の構造(BigIntegerのオブジェクトなど)をネイティブコードを作成するときに非常に特殊なものにマッピングすることを妨げません。 – GhostCat

+0

@Andremoniy私はあなたの質問に多少混乱します。 C++のlong doubleもタイプであり、明らかにハードウェアアーキテクチャを活用しています。私は基本的にBigDecimalが70ビット(64倍以上)に収まるような数字に似たようなことをしています。 – Daishisan

答えて

5

んBigDecimalのは、十分に小さな入力のためにこれを行いますか?

いいえ、できませんでした。浮動小数点数は損失があり、BigDecimalにはすべて、関連する精度があり、その精度以下の任意の数を正確に表すことができます。浮動小数点表記で正確に表すことができるBigDecimalの値があったとしても、実行するのは難しいでしょうから、浮動小数点数としてレンダリングすることができる「十分に小さい」入力はありませんその値に対する操作の並べ替えを行い、指定された精度を維持します。言い換えれば、目的BigDecimalは、速度を犠牲にしながら精度を提供することです。これは浮動小数点とは正反対に実行されます。浮動小数点は速度を優先して精度を犠牲にします。


あなたはJavaがlong doubleサイズの浮動小数点数で動作するための方法を提供していますかどうかを尋ねると、there is notているように聞こえます。 JDKの作者が、言語に追加する必要がないと感じたことは一度もなかったという事実から、我々は結論づけることができます。

+1

待って、浮動小数点数と倍数が一定の精度を維持しないと言っていますか?私は、IEEE規格では、少なくとも標準化された数値の場合の標準的な操作では、ビット数(浮動小数点の場合は32、浮動小数点数の場合は64)に近い精度を維持することが保証されていたという印象を受けました。ダブル)。 – Daishisan

+0

浮動小数点数は精度を持っていますが、一般的に考えている算術精度(小数点以下5桁まで)の概念には対応していません。たとえば、浮動小数点で「0.1」を正確に表現することは不可能です。カバーの下では、近似近似が代わりに使用されます。 Wikipediaはこのことについて[詳細](https://en.wikipedia.org/wiki/Floating_point#Accuracy_problems)に入り、議論することに主に専念した楽しい[blog](http://www.exploringbinary.com/)があります浮動小数点数の問題 – dimo414

+1

ああ、私はBigDecimalが(名前にもかかわらず)ベース10に実際に入っていたことに気付かなかった。私はちょうどそれが整数でないかもしれないという事実に言及された名前の小数を仮定しました。その場合、それは理にかなっています。 – Daishisan

1

No. BigDecimalは、ハードウェアアーキテクチャを利用していません。たとえば、JavaソースコードのBigDecimalのコンストラクタを参照してください。

Javaで
BigDecimal(BigInteger intVal, long val, int scale, int prec) { 
    this.scale = scale; 
    this.precision = prec; 
    this.intCompact = val; 
    this.intVal = intVal; 
} 
+1

JVMが特定のアーキテクチャのための 'BigDecimal'実装を取り替えることができるので、良い点ですが、これは実際には疑問に答えるものではありません。これは例えば「数学」で起こることです。私の知る限りでは、BigDecimalでは何も起こっていませんが、特定の実装を見てもその全体の話は分かりません。 – dimo414

+0

@ dimo414あなたは私に例を挙げることができます - JVMは特定のアーキテクチャのためのXXXX実装を取り替えることができます - それで私はそれを読むことができますか? –

+0

['Math'](https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html)は正規の例です。 JDKの['share'](http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/share/classes/java/lang/Math.java)に含まれているリファレンス実装はおそらくあなたのJVMが使用しているものではありません。 'Math'の正確な動作は未定義であり、個々の実装やアーキテクチャに任せられています。 – dimo414

1

BigDecimalと一般的なハードウェアのlong doubleのサポートの最も重要な違いは、浮動小数点基数です。

BigDecimalの値は、10の累乗倍の整数です。浮動小数点ハードウェアは、通常IEEEバイナリ浮動小数点に基づいており、各値は2の累乗で乗算された整数です。

入力がlong doubleで正確に表現できる計算結果の場合、long doubleで丸め誤差が発生し、指定された位取りでBigDecimalより大きい丸め誤差が発生します。たとえば、1と10の両方を両方の形式で正確に表すことができます。 1を10で割った結果は、スケールが少なくとも1で、基数2の形式ではないBigDecimalで正確に表現できます。

もちろん、いずれの形式でも正確に表現できない多くの合理性があります。 1/3を考慮する。 BigDecimalではスケールにもよりますが、より大きな丸め誤差や小さな丸め誤差が発生します。答えはlong doubleとBigDecimalでまったく同じになることはまずありません。

各計算で2つの形式が同じ回答を得るかどうかを判断するためにテストを行うと、ハードウェアアシストを使用した場合のパフォーマンス上の利益が損なわれます。

関連する問題