diff options
| author | Paul Eggert | 2018-07-18 03:16:54 -0700 |
|---|---|---|
| committer | Paul Eggert | 2018-07-18 03:18:53 -0700 |
| commit | c70d22f70b77b053d01c7380122d166ecb728610 (patch) | |
| tree | 1fe0dee176da15fca2907c84abc7ec096b7e4116 /test/src | |
| parent | ba6cc1d04cef8e25534a72e90a8f0f8db0026c9f (diff) | |
| download | emacs-c70d22f70b77b053d01c7380122d166ecb728610.tar.gz emacs-c70d22f70b77b053d01c7380122d166ecb728610.zip | |
Fix bug with eql etc. on NaNs
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.
Diffstat (limited to 'test/src')
| -rw-r--r-- | test/src/fns-tests.el | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/test/src/fns-tests.el b/test/src/fns-tests.el index d9cca557cf2..e4b9cbe25a4 100644 --- a/test/src/fns-tests.el +++ b/test/src/fns-tests.el | |||
| @@ -23,6 +23,17 @@ | |||
| 23 | 23 | ||
| 24 | (require 'cl-lib) | 24 | (require 'cl-lib) |
| 25 | 25 | ||
| 26 | ;; Test that equality predicates work correctly on NaNs when combined | ||
| 27 | ;; with hash tables based on those predicates. This was not the case | ||
| 28 | ;; for eql in Emacs 26. | ||
| 29 | (ert-deftest fns-tests-equality-nan () | ||
| 30 | (dolist (test (list #'eq #'eql #'equal)) | ||
| 31 | (let* ((h (make-hash-table :test test)) | ||
| 32 | (nan 0.0e+NaN) | ||
| 33 | (-nan (- nan))) | ||
| 34 | (puthash nan t h) | ||
| 35 | (should (eq (funcall test nan -nan) (gethash -nan h)))))) | ||
| 36 | |||
| 26 | (ert-deftest fns-tests-reverse () | 37 | (ert-deftest fns-tests-reverse () |
| 27 | (should-error (reverse)) | 38 | (should-error (reverse)) |
| 28 | (should-error (reverse 1)) | 39 | (should-error (reverse 1)) |