• Paul Eggert's avatar
    Fix bug with eql etc. on NaNs · c70d22f7
    Paul Eggert authored
    Fix a bug where eql, sxhash-eql, memql, and make-hash-table
    were not consistent on NaNs.  Likewise for equal,
    sxhash-equal, member, and make-hash-table.  Some of these
    functions ignored NaN significands, whereas others treated
    them as significant.  It's more logical to treat significands
    as significant, and this typically makes eql a bit more
    efficient on floats, with just one integer comparison instead
    of one to three floating-point comparisons.
    * doc/lispref/numbers.texi (Float Basics): Document that
    NaNs are never numerically equal, but might be eql.
    * src/fns.c (WORDS_PER_DOUBLE): Move to top level of this file.
    (union double_and_words): Now named, and at the top level of this file.
    (same_float): New function.
    (Fmemql, Feql, internal_equal, cmpfn_eql): Use it, so that
    the corresponding functions treat NaNs consistently.
    (sxhash_float): Simplify based on above-mentioned changes.
    
    * test/src/fns-tests.el (fns-tests-equality-nan): New test.
    c70d22f7
fns.c 151 KB