double よりも大きな固定精度で Scala (および/または Java) で計算を実行しようとしています。私は BigDecimals を Scala のデフォルトのMathContextで使用しています。これは精度が 34 です。すべての入力がこの精度を持っていても、数回の計算の後、結果の精度が爆発し始めることがわかりました。
これは、問題を説明していると思われる計算の例です。
import math.BigDecimal
val z40 = BigDecimal(0).setScale(40) // 0E-40
z40.scale // 40
z40.precision // 1
(1 + z40*z40).precision // 81
結果は 81 で、 より精度が高くなりz40
ます。私の場合、setScale を使用したことはありませんが、計算で非常に大きなスケールのゼロが発生しています。
これは私が望む動作ではありません。精度 34が(1 + z40*z40)
必要です。これは、計算が実行されている MathContext の精度です ( z40*z40
1 に比べて無視できるほど小さいため)。どうすればこの種の算数を取得できますか?
更新:この動作は、Scala 2.9.* と 2.10.* の間で MathContext の処理が変更されたためです。(コミットを指摘してくれた Paul Phillips に感謝します。)このディスカッションも参照してください。