2012-03-24 71 views
2

「Clojure的喜悅」說不合理化Java float或double primitives的值。Clojure的合理化

爲什麼不合理化它們,但可以合理化java.lang.Float和java.lang.Double的實例嗎?

[編輯]
書(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 2012-03-24 05:15:48

+0

@Bill我編輯了我的問題。 – Chiron 2012-03-24 13:38:29

回答

1

那麼,合理化雙重訴訟之間是否存在差異?雙(或浮動v.s.浮動)?不,不是。在任何一種情況下,你都會得到一個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

如果合理化原始值會得到對象而不是基元,這將大大減慢計算速度(因爲元信息,您需要執行裝箱/拆箱加上對象值比元素消耗a lot more memory),例如Int將消耗x4內存比int )。

java.lang.Double已經有這個開銷,所以不會有很大的差異。