diff options
author | Tom Tromey <tom@tromey.com> | 2018-07-05 13:19:32 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2018-07-12 22:12:27 -0600 |
commit | 025adce2cf43f4ce9f3c543c1b8973541e1414d2 (patch) | |
tree | f3ea1912a987b717b28b8df9bb33cb12c3965778 /src/floatfns.c | |
parent | 872faabbd8cb0f5518777b2d4fe7de187f684a92 (diff) | |
download | emacs-025adce2cf43f4ce9f3c543c1b8973541e1414d2.tar.gz |
Make abs handle bignums
* src/floatfns.c (Fabs): Handle bignums.
* test/src/floatfns-tests.el (bignum-abs): New test.
Diffstat (limited to 'src/floatfns.c')
-rw-r--r-- | src/floatfns.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/floatfns.c b/src/floatfns.c index bd3f2dec80a..6d7fc1452d3 100644 --- a/src/floatfns.c +++ b/src/floatfns.c @@ -275,9 +275,24 @@ DEFUN ("abs", Fabs, Sabs, 1, 1, 0, doc: /* Return the absolute value of ARG. */) (register Lisp_Object arg) { - CHECK_FIXNUM_OR_FLOAT (arg); + CHECK_NUMBER (arg); - if (FLOATP (arg)) + if (BIGNUMP (arg)) + { + mpz_t val; + mpz_init (val); + mpz_abs (val, XBIGNUM (arg)->value); + arg = make_number (val); + mpz_clear (val); + } + else if (FIXNUMP (arg) && XINT (arg) == MOST_NEGATIVE_FIXNUM) + { + mpz_t val; + mpz_init_set_si (val, - MOST_NEGATIVE_FIXNUM); + arg = make_number (val); + mpz_clear (val); + } + else if (FLOATP (arg)) arg = make_float (fabs (XFLOAT_DATA (arg))); else if (XINT (arg) < 0) XSETINT (arg, - XINT (arg)); |