]> git.eshelyaron.com Git - emacs.git/commitdiff
(Fexpt): Manually check for overflows, so that a power
authorMichaël Cadilhac <michael.cadilhac@lrde.org>
Mon, 1 Oct 2007 09:17:29 +0000 (09:17 +0000)
committerMichaël Cadilhac <michael.cadilhac@lrde.org>
Mon, 1 Oct 2007 09:17:29 +0000 (09:17 +0000)
of a non-zero value can't yield zero.

src/ChangeLog
src/floatfns.c

index 70fbaad280ecf02348d736ae3617fd9e77904efb..e71218880bcf459599636ad867d6c064a1bccbe5 100644 (file)
@@ -1,3 +1,8 @@
+2007-10-01  Micha\e,Ak\e(Bl Cadilhac  <michael@cadilhac.name>
+
+       * floatfns.c (Fexpt): Manually check for overflows, so that a power
+       of a non-zero value can't yield zero.
+
 2007-09-29  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        * term.c (term_clear_mouse_face, term_mouse_highlight)
index 6ad9b95686e7a1ac43884a301545f14a18f8c5bb..a20f7981bf03f37c35ca6116319c325008f461ad 100644 (file)
@@ -454,7 +454,7 @@ DEFUN ("expt", Fexpt, Sexpt, 2, 2, 0,
      (arg1, arg2)
      register Lisp_Object arg1, arg2;
 {
-  double f1, f2;
+  double f1, f2, f3;
 
   CHECK_NUMBER_OR_FLOAT (arg1);
   CHECK_NUMBER_OR_FLOAT (arg2);
@@ -500,8 +500,11 @@ DEFUN ("expt", Fexpt, Sexpt, 2, 2, 0,
   else if ((f1 == 0.0 && f2 < 0.0) || (f1 < 0 && f2 != floor(f2)))
     domain_error2 ("expt", arg1, arg2);
 #endif
-  IN_FLOAT2 (f1 = pow (f1, f2), "expt", arg1, arg2);
-  return make_float (f1);
+  IN_FLOAT2 (f3 = pow (f1, f2), "expt", arg1, arg2);
+  /* Check for overflow in the result.  */
+  if (f1 != 0.0 && f3 == 0.0)
+    range_error ("expt", arg1);
+  return make_float (f3);
 }
 
 DEFUN ("log", Flog, Slog, 1, 2, 0,