On Tue, Oct 9, 2012 at 5:20 PM, David Nolen <[email protected]> wrote: > On Tue, Oct 9, 2012 at 4:38 PM, Brian Craft <[email protected]> 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 [email protected] > Note that posts from new members are moderated - please be patient with your > first post. > To unsubscribe from this group, send email to > [email protected] > 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 [email protected] Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/clojure?hl=en
