On the side of positive recommendations to avoid problems like this, here is some advice:
+ Don't mix floats and doubles in the same Clojure program. Given that Clojure uses double arithmetic by default, it is much easier to use doubles everywhere than it is to try to use floats everywhere. + Don't use NaN in collections. They aren't even equal to themselves, and that inequality propagates to any collections they are in. + Don't use mutable collections as elements of Clojure's immutable collections. They are equal to each other in straightforward equality tests, but are not consistent in their hashes are, much as float/double values are not. See http://dev.clojure.org/jira/browse/CLJ-1372 for one example. If you keep those things out of Clojure collections, I am not aware of any other gotchas there. Andy On Thu, Jan 22, 2015 at 6:44 AM, Plínio Balduino <pbaldu...@gmail.com> wrote: > My one cent: > > But I think (and it's just my humble opinion) is in the scope of Clojure > keep its consistency, am I right? > > I mean, if doubles and floats are different, and they are, I think we > should always get equality test as false. Or always as true, if they're > nominally the same value. > > Regards > > Plínio > > On Thu, Jan 22, 2015 at 12:18 PM, Andy Fingerhut <andy.finger...@gmail.com > > wrote: > >> "It is out of scope for Clojure to fix this for Java types Float/Double" >> -- comments in CLJ-1036: http://dev.clojure.org/jira/browse/CLJ-1036 >> >> Andy >> >> On Thu, Jan 22, 2015 at 5:53 AM, Nicola Mometto <brobro...@gmail.com> >> wrote: >> >>> >>> Not sure if this is intended behaviour: >>> user=> (= (float 1.6) (double 1.6)) >>> false >>> user=> (= (float 1.5) (double 1.5)) >>> true >>> >>> I.e. = (and ==) will return true when comparing floats with doubles IFF >>> the float's .doubleValue roundtrips to the same double it's comparing to. >>> >>> user=> (.doubleValue (float 1.6)) >>> 1.600000023841858 >>> user=> (.doubleValue (float 1.5)) >>> 1.5 >>> >>> I'm not sure why floats are not handled specially in Numbers.java so >>> that hash/comparision is handled consistently with doubles (e.g. by >>> converting the floats to the fitting double via Double.parseDouble), >>> the current behaviour seems odd to me. >>> >>> Jozef Wagner writes: >>> >>> > More on this behavior http://dev.clojure.org/jira/browse/CLJ-1036 >>> > >>> > On Thu, Jan 22, 2015 at 2:00 PM, Nicola Mometto <brobro...@gmail.com> >>> wrote: >>> > >>> >> >>> >> Looking at the PHM impl, this looks like it's caused by (float 0.5) >>> and >>> >> (double 0.5) hashing differently. >>> >> >>> >> user=> (= (float 0.5) (double 0.5)) >>> >> true >>> >> user=> (map hash [(float 0.5) (double 0.5)]) >>> >> (1056964608 1071644672) >>> >> >>> >> Nicola Mometto writes: >>> >> >>> >> > Looks like it's a bug in PersistentHashMap: >>> >> > user=> (contains? (hash-map {:a (float 0.5)} 1) {:a (double 0.5)}) >>> >> > false >>> >> > user=> (contains? (array-map {:a (float 0.5)} 1) {:a (double 0.5)}) >>> >> > true >>> >> > >>> >> > Immo Heikkinen writes: >>> >> > >>> >> >> (= (float 0.5) (double 0.5)) >>> >> >> => true >>> >> >> (= #{(float 0.5)} #{(double 0.5)}) >>> >> >> => true >>> >> >> (= {:a (float 0.5)} {:a (double 0.5)}) >>> >> >> => true >>> >> >> (= #{{:a (float 0.5)}} #{{:a (double 0.5)}}) >>> >> >> => false >>> >> >> >>> >> >> >>> >> >> Tested with both 1.6.0 and 1.7.0-alpha5. >>> >> >>> >> -- >>> >> >>> >> -- >>> >> 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 unsubscribe from this group and stop receiving emails from it, >>> send an >>> >> email to clojure+unsubscr...@googlegroups.com. >>> >> For more options, visit https://groups.google.com/d/optout. >>> >> >>> >>> -- >>> >>> -- >>> 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 unsubscribe from this group and stop receiving emails from it, send >>> an email to clojure+unsubscr...@googlegroups.com. >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> -- >> 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 unsubscribe from this group and stop receiving emails from it, send an >> email to clojure+unsubscr...@googlegroups.com. >> For more options, visit https://groups.google.com/d/optout. >> > > -- > 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 unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- 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 unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.