]> git.eshelyaron.com Git - emacs.git/commitdiff
(extract_float, Fabs, Ffloat) [HAVE_LIBGMP]: Handle
authorGerd Moellmann <gerd@gnu.org>
Tue, 16 Oct 2001 11:02:08 +0000 (11:02 +0000)
committerGerd Moellmann <gerd@gnu.org>
Tue, 16 Oct 2001 11:02:08 +0000 (11:02 +0000)
bigints.

src/floatfns.c

index db1c3a7231ef3661e50459b0875966a12b9a0187..e9a88a76a37c237789131407f1297d3ff6aa5dde 100644 (file)
@@ -218,12 +218,25 @@ double
 extract_float (num)
      Lisp_Object num;
 {
-  CHECK_NUMBER_OR_FLOAT (num, 0);
+  double d;
 
   if (FLOATP (num))
-    return XFLOAT_DATA (num);
-  return (double) XINT (num);
+    d = XFLOAT_DATA (num);
+  else if (FIXNUMP (num))
+    d = (double) XINT (num);
+#ifdef HAVE_LIBGMP
+  else if (BIGINTP (num))
+    d = mpz_get_d (XBIGNUM (num)->u.i);
+#endif
+  else
+    {
+      wrong_type_argument (Qnumberp, num);
+      d = 0;
+    }
+  
+  return d;
 }
+
 \f
 /* Trig functions.  */
 
@@ -447,8 +460,8 @@ DEFUN ("expt", Fexpt, Sexpt, 2, 2, 0,
 
   CHECK_NUMBER_OR_FLOAT (arg1, 0);
   CHECK_NUMBER_OR_FLOAT (arg2, 0);
-  if (INTEGERP (arg1)     /* common lisp spec */
-      && INTEGERP (arg2)) /* don't promote, if both are ints */
+  if (FIXNUMP (arg1)     /* common lisp spec */
+      && FIXNUMP (arg2)) /* don't promote, if both are ints */
     {                          /* this can be improved by pre-calculating */
       EMACS_INT acc, x, y;     /* some binary powers of x then accumulating */
       Lisp_Object val;
@@ -646,13 +659,24 @@ DEFUN ("abs", Fabs, Sabs, 1, 1, 0,
   (arg)
      register Lisp_Object arg;
 {
+#ifdef HAVE_LIBGMP
+  if (FLOATP (arg))
+    IN_FLOAT (arg = make_float (fabs (XFLOAT_DATA (arg))), "abs", arg);
+  else if (FIXNUMP (arg) && XINT (arg) < 0)
+    XSETINT (arg, - XINT (arg));
+  else if (BIGINTP (arg) && mpz_sgn (XBIGNUM (arg)->u.i) < 0)
+    {
+      arg = make_bigint (XBIGNUM (arg)->u.i);
+      mpz_neg (XBIGNUM (arg)->u.i, XBIGNUM (arg)->u.i);
+    }
+#else
   CHECK_NUMBER_OR_FLOAT (arg, 0);
 
   if (FLOATP (arg))
     IN_FLOAT (arg = make_float (fabs (XFLOAT_DATA (arg))), "abs", arg);
   else if (XINT (arg) < 0)
     XSETINT (arg, - XINT (arg));
-
+#endif
   return arg;
 }
 
@@ -661,12 +685,20 @@ DEFUN ("float", Ffloat, Sfloat, 1, 1, 0,
   (arg)
      register Lisp_Object arg;
 {
+#ifdef HAVE_LIBGMP
+  if (FIXNUMP (arg) || BIGINTP (arg))
+    arg = make_float (extract_float (arg));
+  else if (!FLOATP (arg))
+    wrong_type_argument (Qnumberp, arg);
+  return arg;
+#else
   CHECK_NUMBER_OR_FLOAT (arg, 0);
 
-  if (INTEGERP (arg))
+  if (FIXNUMP (arg))
     return make_float ((double) XINT (arg));
   else                         /* give 'em the same float back */
     return arg;
+#endif
 }
 
 DEFUN ("logb", Flogb, Slogb, 1, 1, 0,