Clojure: = vs ==

Я борюсь с пониманием, почему

(= 1 1.0)

оценивается как false, тогда как

(== 1 1.0)

имеет значение true. Согласно docs, ==, похоже, работает только на числах, но кроме этого, не кажется большой разницей. Итак, что мне не хватает?

Ответ 1

== проверяет математическую эквивалентность. = с числами проверяет эквивалентность способом, который агностик по размеру, где это применимо, но строг относительно представления:

user> (= (float 1.0) (double 1.0))
true
user> (= (int 1) (byte 1))
true
user> (= (int 1) (double 1))
false
user> (= 0.5 (/ 1 2))
false
user> (== 0.5 (/ 1 2))
true

предположительно, рассуждение состоит в том, что представление о плавающей точке может потерять точность и не должно рассматриваться как эквивалентное интегральным или точным представлениям.