]> git.eshelyaron.com Git - emacs.git/commitdiff
(calculator-expt): Use more cases to determine the value.
authorJay Belanger <jay.p.belanger@gmail.com>
Wed, 4 Jul 2007 13:54:30 +0000 (13:54 +0000)
committerJay Belanger <jay.p.belanger@gmail.com>
Wed, 4 Jul 2007 13:54:30 +0000 (13:54 +0000)
lisp/ChangeLog
lisp/calculator.el

index 5f68d1e20a3ca2424b56a55f6eeecd7ae8876041..0912a5d6809fcd7cc832a813b5802cb4ec956947 100644 (file)
@@ -1,3 +1,8 @@
+2007-07-04  Jay Belanger  <jay.p.belanger@gmail.com>
+
+       * calculator.el (calculator-expt): Use more cases to determine
+       the value.
+
 2007-07-03  Jay Belanger  <jay.p.belanger@gmail.com>
 
        * calculator.el (calculator-expt, calculator-integer-p):
index c1e0edb627648896789e855a8c570c566cc930a7..b0e3069d3e1b8107e0e3914e9788743a02389204 100644 (file)
@@ -1793,14 +1793,28 @@ To use this, apply a binary operator (evaluate it), then call this."
       (expt x y)
     (domain-error 0.0e+NaN)
     (range-error
-     (if (> y 0) 
-         (if (and
-              (< x 0)
-              (= y (truncate y))
-              (oddp (truncate y)))
-             -1.0e+INF
-           1.0e+INF)
-       0.0))
+     (cond
+      ((and (< x 1.0) (> x -1.0))
+       ;; For small x, the range error comes from large y.
+       0.0)
+      ((and (> x 0.0) (< y 0.0))
+       ;; For large positive x and negative y, the range error 
+       ;; comes from large negative y.
+       0.0)
+      ((and (> x 0.0) (> y 0.0))
+       ;; For large positive x and positive y, the range error 
+       ;; comes from large y.
+       1.0e+INF)
+      ;; For the rest, x must be large and negative.
+      ;; The range errors come from large integer y.
+      ((< y 0.0)
+       0.0)
+      ((oddp (truncate y))
+       ;; If y is odd
+       -1.0e+INF)
+      (t
+       ;; 
+       1.0e+INF)))
     (error 0.0e+NaN)))
 
 (defun calculator-fact (x)