diff --git a/src/code/irrat-dd.lisp b/src/code/irrat-dd.lisp index 170bc06a96869c6b8f6d3651d29918cca2314c76..6661f2b1cac62a6f3176802beb78bdcf96738921 100644 --- a/src/code/irrat-dd.lisp +++ b/src/code/irrat-dd.lisp @@ -1000,8 +1000,11 @@ pi/4 11001001000011111101101010100010001000010110100011000 010001101001100010 (declare (type (double-double-float -1w0 1w0) x) (optimize (speed 2) (space 0) (inhibit-warnings 3))) - (let ((x2 (* x x))) - (+ x (* x (* x2 (poly-eval x2 sincof)))))) + (if (< (abs (double-double-hi x)) + (scale-float 1d0 -52)) + x + (let ((x2 (* x x))) + (+ x (* x (* x2 (poly-eval x2 sincof))))))) ;; cos(x) = 1 - .5 x^2 + x^2 (x^2 P(x^2)) ;; Theoretical peak relative error = 2.1e-37,