On Tue, Oct 9, 2012 at 5:20 PM, David Nolen <dnolen.li...@gmail.com> wrote: > On Tue, Oct 9, 2012 at 4:38 PM, Brian Craft <craft.br...@gmail.com> wrote: >> Can someone explain the last result here? >> >>> [1 2 3 Float/NaN] >> [1 2 3 NaN] >>> (= Float/NaN Float/NaN) >> false
This is a primitive comparison and follows IEEE floating point semantics. NaN must not equal NaN. >> ; all is good so far, but... >> (filter #(= % %) [1 2 3 Float/NaN 4]) >> (1 2 3 NaN 4) This is an Object comparison, and in Java this follows the contract for equals and hashCode. Thus, an object must be equal to itself (for HashMap to work). See: http://stackoverflow.com/questions/1408569/why-does-double-nan-equal-itself-when-wrapped-in-a-double-instance and in particular: http://docs.oracle.com/javase/6/docs/api/java/lang/Double.html#equals(java.lang.Object) >> >> Now I'm lost. What just happened? > > The behavior is strange, I've simplified it a bit to the following: > >> ((fn [x] (= x x)) Float/NaN) > true >> ((fn [x y] (= x y)) Float/NaN Float/NaN) > false > > This is using Clojure 1.4.0 > > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with your > first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en