summaryrefslogtreecommitdiff
path: root/src/floatfns.c
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2018-07-05 13:19:32 -0600
committerTom Tromey <tom@tromey.com>2018-07-12 22:12:27 -0600
commit025adce2cf43f4ce9f3c543c1b8973541e1414d2 (patch)
treef3ea1912a987b717b28b8df9bb33cb12c3965778 /src/floatfns.c
parent872faabbd8cb0f5518777b2d4fe7de187f684a92 (diff)
downloademacs-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.c19
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));