From: Tom Tromey Date: Thu, 5 Jul 2018 19:17:36 +0000 (-0600) Subject: Allow conversion of bignums to floats X-Git-Tag: emacs-27.0.90~4598^2~29 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=872faabbd8cb0f5518777b2d4fe7de187f684a92;p=emacs.git Allow conversion of bignums to floats * src/floatfns.c (extract_float, Ffloat): Handle bignums. * src/lisp.h (XFLOATINT): Handle bignums. * test/src/floatfns-tests.el (bignum-to-float): New test. --- diff --git a/src/floatfns.c b/src/floatfns.c index 766044ba35c..bd3f2dec80a 100644 --- a/src/floatfns.c +++ b/src/floatfns.c @@ -67,7 +67,7 @@ CHECK_FLOAT (Lisp_Object x) double extract_float (Lisp_Object num) { - CHECK_FIXNUM_OR_FLOAT (num); + CHECK_NUMBER (num); return XFLOATINT (num); } @@ -289,8 +289,10 @@ DEFUN ("float", Ffloat, Sfloat, 1, 1, 0, doc: /* Return the floating point number equal to ARG. */) (register Lisp_Object arg) { - CHECK_FIXNUM_OR_FLOAT (arg); + CHECK_NUMBER (arg); + if (BIGNUMP (arg)) + return make_float (mpz_get_d (XBIGNUM (arg)->value)); if (FIXNUMP (arg)) return make_float ((double) XINT (arg)); else /* give 'em the same float back */ diff --git a/src/lisp.h b/src/lisp.h index be679320494..63b057073d0 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -2919,6 +2919,8 @@ CHECK_FIXNAT (Lisp_Object x) INLINE double XFLOATINT (Lisp_Object n) { + if (BIGNUMP (n)) + return mpz_get_d (XBIGNUM (n)->value); return FLOATP (n) ? XFLOAT_DATA (n) : XINT (n); } diff --git a/test/src/floatfns-tests.el b/test/src/floatfns-tests.el index cb173eea76d..c87445b6bd2 100644 --- a/test/src/floatfns-tests.el +++ b/test/src/floatfns-tests.el @@ -34,4 +34,8 @@ (should-error (ftruncate 0) :type 'wrong-type-argument) (should-error (fround 0) :type 'wrong-type-argument)) +(ert-deftest bignum-to-float () + (should (eql (float (+ most-positive-fixnum 1)) + (+ (float most-positive-fixnum) 1)))) + (provide 'floatfns-tests)