diff --git a/src/code/irrat.lisp b/src/code/irrat.lisp index 8ddd4138161d1ea7d12e0afeb40da6337af9cedf..fa891427ecbdf33ba8f2190cf44d72d70394fea9 100644 --- a/src/code/irrat.lisp +++ b/src/code/irrat.lisp @@ -669,7 +669,11 @@ (foreach integer single-float)) (float (log2 (float number 1d0)) 1f0)) ((single-float double-float) - (log2 (float number 1d0))))) + (log2 (float number 1d0))) + #+double-double + (((foreach integer single-float double-float) + ext:double-double-float) + (log2 (float number 1w0) base)))) ((and (= base 10) (floatp number) #+double-double @@ -687,7 +691,13 @@ (foreach single-float integer)) (float (%log10 (float number 1d0)) 1f0)) ((single-float double-float) - (%log10 (float number 1d0))))) + (%log10 (float number 1d0))) + #+double-double + (((foreach integer single-float double-float) + ext:double-double-float) + ;; This could be more accurate! + (/ (log (float number 1w0)) + (log 10w0))))) (t ;; CLHS 12.1.4.1 says ;; @@ -729,11 +739,14 @@ #+double-double ((double-double-float (foreach fixnum bignum ratio)) + ;; Use log2 in case the base is so large that it + ;; won't fit in a float. (/ (log2 number 1w0) (log2 base 1w0))) #+double-double ((double-double-float (foreach double-double-float double-float single-float)) - (/ (log number) (log (coerce base 'double-double-float)))) + (/ (log number) + (log (coerce base 'double-double-float)))) #+double-double (((foreach fixnum bignum ratio) double-double-float)