From bacaecf21ab7a9568e8d93dfc307851caa36d9e6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20Kochma=C5=84ski?= <daniel@turtleware.eu>
Date: Thu, 22 Dec 2016 11:15:14 +0100
Subject: [PATCH] atan: add atan2 tests for 0 arguments

---
 numbers/atan.lsp | 53 ++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 49 insertions(+), 4 deletions(-)

diff --git a/numbers/atan.lsp b/numbers/atan.lsp
index 09e24b36..fdf8c9cd 100644
--- a/numbers/atan.lsp
+++ b/numbers/atan.lsp
@@ -126,6 +126,55 @@
 ;;; FIXME
 ;;; More accuracy tests here
 
+;;; ieee-fp tests
+(deftest atan.ieee.1 :description "Verify if atan handles 0.0 correctly"
+  ;; (atan +-0 +(anything-but-nan))  -> +-0
+  ;; (atan +-0 -(anything-but-nan))  -> +-pi
+  (flet ((pip (a b)
+           ;; we are not testing accuracy, so this simplified
+           ;; precdicate would be sufficient for our needs. We are
+           ;; also not interested in sign of the result, because we
+           ;; don't know whenever zero is signed or not.
+           (<= (abs (- (abs a) (abs b))) 0.01)))
+    (every #'identity
+           (append
+            (map 'list (lambda (n)
+                         ;; notice, that we don't test a case, where
+                         ;; both arguments are 0.0, because if
+                         ;; implementation doesn't support signed 0
+                         ;; result is undefined.
+                         (and (zerop (atan -0.0 n))
+                              (zerop (atan +0.0 n))
+                              (pip pi (atan +0.0 (- n)))
+                              (pip pi (atan -0.0 (- n)))))
+                 (remove-if-not #'plusp *floats*))
+            ;; (atan +-(anything-but-0/nan) 0) -> +-pi/2
+            (map 'list (lambda (n)
+                         (and (pip (* +1/2 pi) (atan n +0.0))
+                              (pip (* -1/2 pi) (atan n -0.0))))
+                 (remove-if #'zerop *floats*)))))
+  T)
+
+;;; We could have tested also for infinities and signed 0, but there
+;;; is no portable ieee-fp, we could put it in ansi-beyond test suite
+;;; though:
+;;;
+;;;   (atan +0.0 -anything-but-0/nan/inf)   -> +pi
+;;;   (atan -0.0 -anything-but-0/nan/inf)   -> -pi
+;;;   (atan +0.0 +0.0)                      -> +0.0
+;;;   (atan -0.0 +0.0)                      -> -0.0
+;;;   (atan +0.0 -0.0)                      -> +pi
+;;;   (atan -0.0 -0.0)                      -> -pi
+;;;   (atan (anything) nan)                 -> nan
+;;;   (atan nan (anything))                 -> nan
+;;;   (atan +-inf +inf)                     -> +-pi/4
+;;;   (atan +-inf -inf)                     -> +-3pi/4
+;;;   (atan +-(anything-but-inf/nan), +inf) -> +-0
+;;;   (atan +-(anything-but-inf/nan), -inf) -> +-pi
+;;;   (atan +-inf (anything-but-0/nan/inf)) -> +-pi/2
+;;;
+;;; (deftest atan.ieee.2 t t)
+
 ;;; Error tests
 
 (deftest atan.error.1
@@ -147,7 +196,3 @@
 (deftest atan.error.5
   (check-type-error #'(lambda (x) (atan 1 x)) #'realp)
   nil)
-
-
-
-
-- 
GitLab