]> git.eshelyaron.com Git - emacs.git/commitdiff
calc-math.el (math-largest-emacs-expt): Handle the cases when expt
authorJay Belanger <jay.p.belanger@gmail.com>
Mon, 1 Oct 2007 03:18:00 +0000 (03:18 +0000)
committerJay Belanger <jay.p.belanger@gmail.com>
Mon, 1 Oct 2007 03:18:00 +0000 (03:18 +0000)
doesn't give range errors.

lisp/ChangeLog
lisp/calc/calc-math.el

index ac151a50bf06ea21b649f7745de00832a55eec71..b8546373c9774a510081e739c71be31b2127c5a8 100644 (file)
@@ -1,3 +1,13 @@
+2007-10-01  Jay Belanger  <jay.p.belanger@gmail.com>
+
+       * calc/calc-math.el (math-largest-emacs-expt): Handle the cases
+       when `expt' doesn't give range errors.
+
+2007-10-01  Markus Triska  <markus.triska@gmx.at>
+
+       * calc/calc-math.el (math-smallest-emacs-expt):  Make the
+       computation more robust.
+
 2007-09-30  David Kastrup  <dak@gnu.org>
 
        * startup.el (argv): Alias for `command-line-args-left' to use as
index 0b4c82d12928b468624d9c4352d83fae3e01d085..1aab53524f880e9de80ad19027d2bf2eb84aa6bd 100644 (file)
 ;;; is an Emacs float, for acceptable d.dddd....
 
 (defvar math-largest-emacs-expt
-  (let ((x 1))
-    (while (condition-case nil
-               (expt 10.0 x)
-             (error nil))
-      (setq x (* 2 x)))
-    (setq x (/ x 2))
-    (while (condition-case nil
-               (expt 10.0 x)
-             (error nil))
-      (setq x (1+ x)))
-    (- x 2))
+  (let ((x 1)
+        (pow 1e2))
+    ;; The following loop is for efficiency; it should stop when 
+    ;; 10^(2x) is too large.  This could be indicated by a range 
+    ;; error when computing 10^(2x), an infinite value for 10^(2x), 
+    ;; or (!) a zero value for 10^(2x).
+    (while (and
+            pow
+            (< pow 1.0e+INF)
+            (> pow 0.0))
+      (setq x (* 2 x))
+      (setq pow (condition-case nil
+                    (expt 10.0 (* 2 x))
+                  (error nil))))
+    ;; The following loop should stop when 10^(x+1) is too large.
+    (setq pow (condition-case nil
+                    (expt 10.0 (1+ x))
+                  (error nil)))
+    (while (and
+            pow
+            (< pow 1.0e+INF)
+            (> pow 0.0))
+      (setq x (1+ x))
+      (setq pow (condition-case nil
+                    (expt 10.0 (1+ x))
+                  (error nil))))
+    (1- x))
   "The largest exponent which Calc will convert to an Emacs float.")
 
 (defvar math-smallest-emacs-expt