From: Rupert S. <rsw...@us...> - 2014-02-19 22:44:51
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Maxima CAS". The branch, master has been updated via 50ae20e6e7d0727aa362560b64a3f988e28cd0fa (commit) from 08bf62f64b4162a765592e07424991e51b69c35d (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 50ae20e6e7d0727aa362560b64a3f988e28cd0fa Author: Rupert Swarbrick <rsw...@gm...> Date: Wed Feb 19 22:38:02 2014 +0000 Avoid erroring when computing 1000!^0.1 This was the original bug report that triggered all the discussion about promotion to big floats. Unfortunately, I seem to be illiterate and didn't realise that I'd misread it as 1000!*0.1 until rtoy pointed it out. More stupidly still, my changes for the former case actually end up breaking this example, where exptrl assumed that (addk r1 0.0) was always a float. Maybe there's a better fix than this, avoiding any bigfloat conversion when the result is small enough to fit in a machine float, but here's a quick fix that at least gives a useful answer rather than a lisp error. diff --git a/src/simp.lisp b/src/simp.lisp index 10f8835..6a0f320 100644 --- a/src/simp.lisp +++ b/src/simp.lisp @@ -2156,7 +2156,14 @@ ((and (equal (setq y (* 2.0 r2)) (float (floor y))) (not (equal r1 %e-val))) (exptb (sqrt r1) (floor y))) - (t (exp (* r2 (log r1))))))) + ;; If bfloat conversion turned r1 or r2 into a bigfloat, we + ;; can't call cl:exp or cl:log here, but we *can* safely + ;; recurse (which will usually give a noun form that then gets + ;; simplified) + ((or ($bfloatp r1) ($bfloatp r2)) + (exptrl r1 r2)) + (t + (exp (* r2 (log r1))))))) ((floatp r2) (list '(mexpt simp) r1 r2)) ((integerp r2) (cond ((minusp r2) diff --git a/tests/rtest16.mac b/tests/rtest16.mac index d645f95..ef01a76 100644 --- a/tests/rtest16.mac +++ b/tests/rtest16.mac @@ -1873,6 +1873,9 @@ true$ bfloatp(1000! * 0.01); true$ +floor(log(1000! ^ 0.1)); +591$ + /* Test the behaviour of promote_float_to_bigfloat */ errcatch (block ([promote_float_to_bigfloat: false], 1000! * 0.01)); []$ ----------------------------------------------------------------------- Summary of changes: src/simp.lisp | 9 ++++++++- tests/rtest16.mac | 3 +++ 2 files changed, 11 insertions(+), 1 deletions(-) hooks/post-receive -- Maxima CAS |