Рационализация в Clojure - PullRequest
       18

Рационализация в Clojure

2 голосов
/ 24 марта 2012

«Радость Clojure» говорит не рационализировать значения, которые являются Java float или double примитивами.

Почему бы не рационализировать их, но можно рационализировать экземпляры java.lang.Float и java.lang.Double?

[EDIT]
Книга ( стр. 67 ) не предполагает, что можно рационализировать java.lang.Float или java.lang.Double, но показывает пример:

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

Ответы [ 2 ]

1 голос
/ 24 марта 2012

Итак, есть ли разница между рационализацией двойного против. Double (или поплавок против поплавка)? Нет, не совсем. В любом случае вы в конечном итоге получите объект 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 голос
/ 24 марта 2012

Если вы рационализируете значения примитивов, вы получите объекты вместо примитивов, и это значительно замедлит ваши вычисления (вам нужно будет выполнить упаковку / распаковку, а значения объектов потребляют намного больше памяти , чемпримитивы из-за метаинформации, например, Int будет занимать в 4 раза больше памяти, чем int).

java.lang.Double уже имеет эти издержки, поэтому не будет большой разницы.

...