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

Reply via email to