2012-03-24 2 views
2

「Clojureの喜び」は、Javaのfloat型またはdouble型のプリミティブの値を合理化しないと言っています。Clojureの合理化

なぜ合理化しないのですが、java.lang.Floatとjava.lang.Doubleのインスタンスを合理化しても大丈夫ですか?

[EDIT]
ブック(page 67は)java.lang.Floatのかがjava.lang.Doubleを合理化しても大丈夫であることを示唆しているわけではありませんが、一例を示しています。あなたは合理化した場合

(def a (rationalize 1.0e50)) 
(def b (rationalize -1.0e50)) 
(def c (rationalize 17.0e00)) 
+1

それはどこですか?私が見つけることができるもっとも近いものは、セクション4.2.3にあります。これは、浮動小数点数/倍精度での算術よりもはるかに遅いので、いつ実行するかを慎重に決定すると言います。 – Bill

+0

@Bill私の質問を編集しました。 – Chiron

答えて

1

だから、二重v.s.を合理化することに違いがありますか? a Double(またはfloat vs.a Float)?いいえ、実際はありません。どちらの場合も、Ratioオブジェクトで終わることになります。そのタイプで多くの計算を実行すると、同じパフォーマンス特性を持つことになります。

user=> (class (rationalize 0.56)) 
clojure.lang.Ratio 
user=> (class (Double. 0.56)) 
java.lang.Double 
user=> (class (rationalize (Double. 0.56))) 
clojure.lang.Ratio 

しかし、この種の精度が必要な場合は、それが行く方法です。しかし、標準のコンピュータ浮動小数点演算を使用することができれば、Ratioオブジェクトで作業するよりもはるかに直接機械命令に変換されるので、より効果的です。

1

をプリミティブの値はプリミティブではなくオブジェクトを取得します。これにより、計算が大幅に遅くなります(ボクシング/アンボックスとオブジェクト値の両方を使用する必要があります)。はintよりも4倍のメモリを消費します。 )。

java.lang.Doubleすでにこのオーバーヘッドがあるので、大きな違いはありません。