From: Gerd Moellmann Date: Tue, 16 Oct 2001 11:02:08 +0000 (+0000) Subject: (extract_float, Fabs, Ffloat) [HAVE_LIBGMP]: Handle X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=521d096e2f71ef183c9ee53e4cd9af1fe653a17b;p=emacs.git (extract_float, Fabs, Ffloat) [HAVE_LIBGMP]: Handle bigints. --- diff --git a/src/floatfns.c b/src/floatfns.c index db1c3a7231e..e9a88a76a37 100644 --- a/src/floatfns.c +++ b/src/floatfns.c @@ -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; } + /* 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,