Raymond Toy pushed to branch master at cmucl / cmucl
Commits: 507f6d9e by Raymond Toy at 2015-12-22T21:35:14Z Add inexact exception test for asinh.
- - - - -
1 changed file:
- tests/fdlibm.lisp
Changes:
===================================== tests/fdlibm.lisp ===================================== --- a/tests/fdlibm.lisp +++ b/tests/fdlibm.lisp @@ -14,6 +14,15 @@ (kernel:make-double-float #x7ff00000 1) "A randon signaling MaN value")
+(defmacro with-inexact-exception-enabled (&body body) + (let ((old-modes (gensym "OLD-MODES-"))) + `(let ((,old-modes (ext:get-floating-point-modes))) + (unwind-protect + (progn + (ext:set-floating-point-modes :traps '(:inexact)) + ,@body) + (apply 'ext:set-floating-point-modes ,old-modes))))) + (define-test %cosh.exceptions (:tag :fdlibm) (assert-error 'floating-point-overflow @@ -285,10 +294,20 @@ (:tag :fdlibm) (assert-eql -0d0 (asinh -0d0)) (assert-eql 0d0 (asinh 0d0)) - (let ((x (scale-float 1d0 -29))) + (let ((x (scale-float 1d0 -29)) + (x0 0d0)) ;; asinh(x) = x for x < 2^-28 (assert-eql x (asinh x)) - (assert-eql (- x) (asinh (- x)))) + (assert-eql (- x) (asinh (- x))) + (with-inexact-exception-enabled + ;; This must not throw an inexact exception because the result + ;; is exact when the arg is 0. + (assert-eql 0d0 (asinh x0))) + (with-inexact-exception-enabled + ;; This must throw an inexact exception for non-zero x even + ;; though the result is exactly x. + (assert-error 'floating-point-inexact + (asinh x)))) (let ((x (scale-float 1d0 -28))) ;; Case 2 > |x| >= 2^-28 (assert-eql 3.725290298461914d-9 (asinh x))
View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/commit/507f6d9e658dd231fb22b84029...