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

Reply via email to