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. */
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;
(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;
}
(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,