aboutsummaryrefslogtreecommitdiffstats
path: root/test/src/floatfns-tests.el
diff options
context:
space:
mode:
authorPaul Eggert2019-11-14 18:51:17 -0800
committerPaul Eggert2019-11-14 18:52:48 -0800
commit8b848def9bc3c4ad786670d0447a6fb396f2ff30 (patch)
treeb7343d7e0c5ae80efc702e23c0b2037c8693d96a /test/src/floatfns-tests.el
parent6ea1e35f6f8b89b979e660bf04bda1757c0cdff0 (diff)
downloademacs-8b848def9bc3c4ad786670d0447a6fb396f2ff30.tar.gz
emacs-8b848def9bc3c4ad786670d0447a6fb396f2ff30.zip
Handle weird cases like (ceil 0 0.0)
* src/floatfns.c (double_integer_scale): Distinguish Inf from NaN. (rounding_driver): Handle (ceil 0 0.0) and (ceil 0 1.0e+INF). * test/src/floatfns-tests.el (special-round): Add tests for weird cases like this. Avoid crash with (floor 0 0.0) * src/floatfns.c (rounding_driver): Signal an arithmetic error if divisor is 0.0 or -0.0, instead of crashing.
Diffstat (limited to 'test/src/floatfns-tests.el')
-rw-r--r--test/src/floatfns-tests.el24
1 files changed, 11 insertions, 13 deletions
diff --git a/test/src/floatfns-tests.el b/test/src/floatfns-tests.el
index 7f1d4691bf0..0eef3de75f7 100644
--- a/test/src/floatfns-tests.el
+++ b/test/src/floatfns-tests.el
@@ -106,19 +106,17 @@
106 (zerop (% (round n d) 2))))))))))) 106 (zerop (% (round n d) 2)))))))))))
107 107
108(ert-deftest special-round () 108(ert-deftest special-round ()
109 (let ((ns '(-1e+INF 1e+INF -1 1 -1e+NaN 1e+NaN))) 109 (dolist (f '(ceiling floor round truncate))
110 (dolist (n ns) 110 (let ((ns '(-1e+INF 1e+INF -1 -0.0 0.0 0 1 -1e+NaN 1e+NaN)))
111 (unless (<= (abs n) 1) 111 (dolist (n ns)
112 (should-error (ceiling n)) 112 (if (not (<= (abs n) 1))
113 (should-error (floor n)) 113 (should-error (funcall f n))
114 (should-error (round n)) 114 (should (= n (funcall f n)))
115 (should-error (truncate n))) 115 (dolist (d '(-1e+INF 1e+INF))
116 (dolist (d ns) 116 (should (eq 0 (funcall f n d)))))
117 (unless (<= (abs (/ n d)) 1) 117 (dolist (d ns)
118 (should-error (ceiling n d)) 118 (when (or (zerop d) (= (abs n) 1e+INF) (not (= n n)) (not (= d d)))
119 (should-error (floor n d)) 119 (should-error (funcall f n d))))))))
120 (should-error (round n d))
121 (should-error (truncate n d)))))))
122 120
123(ert-deftest big-round () 121(ert-deftest big-round ()
124 (should (= (floor 54043195528445955 3) 122 (should (= (floor 54043195528445955 3)