2017-07-06 27 views
3

私はマンデルブロセットエクスプローラを書いています。私はできるだけズームを可能にするためにできるだけ多くの精度が必要です。ダブルスは私のBigDecimalの数学を汚染しています

Iはdouble s及びBigDecimal Sを混合する不幸な副作用に気づいた:彼らは、タイプが返さ "汚染":

(type (* 1M 2)) 
=> java.math.BigDecimal 

(type (* 1M 2.0)) 
=> java.lang.Double 

Iが逆に期待。 BigDecimalsは潜在的により正確ですが、ダブルスを汚染するはずです。

手動BigDecimalに接触して来るかもしれないすべての番号にbigdecを呼び出すだけでなく、double sおよびBigDecimal Sに数学をやったときにdoubleに自動ダウングレードを防止する方法はありますか?

+0

は私にバグのように聞こえます –

+0

いいえ、バグではありません。それは目的のためにこの方法です。 –

+0

将来これを読んでいる人にとって、私の解決の問題は小数精度の欠如に起因していないことに注意してください。マンデルブロアルゴリズムの最大反復回数が少なすぎました。私は50から200に上げました。倍精度でさえもかなりのズームが得られます。 – Carcigenicate

答えて

9

doubleを数式に導入すると、可能な限りの精度が制限されます。小数点以下の桁数のBigDecimalは、15桁以上の有効桁数で何かを掛け合わせることによって、あなたには役に立たない。あなたはBigDecimalに結果を宣伝することができますが、好きかどうかにかかわらず、1トンの精度が失われてしまいます。したがって、Clojureのプロモーションルールは、高精度のBigDecimalの代わりにdoubleを返すことで、あなたに明白になります。

倍精度を暗黙的または明示的にBigDecimalに変換することが悪い考えである理由については、たとえばhttp://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html#BigDecimal-double-を参照してください。

+0

ああ、意味があります。ありがとう。 Bigdecimalをどこでも使用しているにもかかわらず、私はまだズームインできない硬い境界で終わるのです。今私はちょうど私がBigDecimalに二重にキャストしているところを調べて、それが私の精度を制限するようにする必要があります。 – Carcigenicate

3

これは実際には間違っていても、実際にはバグではありません。より明確に間違って見て答えがこれらの式を比較するために、これはつながる方法を表示するには:

user> (* 2.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001M 1.0) 
2.0 
user> (* 2.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001M 1.0M) 
2.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010M 

お勧めとしてあなたはおそらく、する必要があります。当面は、あなただけのプログラムで大きな小数を使用してください。おそらくIO関数に限定され、導入する定数には最後にMが必要です。関数への前提条件の追加は、いくつかのケースを捉えるのに役立ちます。

+0

私は間違っていた、これはバグではありません –