diff options
| author | Tom Tromey | 2018-07-05 13:19:32 -0600 |
|---|---|---|
| committer | Tom Tromey | 2018-07-12 22:12:27 -0600 |
| commit | 025adce2cf43f4ce9f3c543c1b8973541e1414d2 (patch) | |
| tree | f3ea1912a987b717b28b8df9bb33cb12c3965778 /src | |
| parent | 872faabbd8cb0f5518777b2d4fe7de187f684a92 (diff) | |
| download | emacs-025adce2cf43f4ce9f3c543c1b8973541e1414d2.tar.gz emacs-025adce2cf43f4ce9f3c543c1b8973541e1414d2.zip | |
Make abs handle bignums
* src/floatfns.c (Fabs): Handle bignums.
* test/src/floatfns-tests.el (bignum-abs): New test.
Diffstat (limited to 'src')
| -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, | |||
| 275 | doc: /* Return the absolute value of ARG. */) | 275 | doc: /* Return the absolute value of ARG. */) |
| 276 | (register Lisp_Object arg) | 276 | (register Lisp_Object arg) |
| 277 | { | 277 | { |
| 278 | CHECK_FIXNUM_OR_FLOAT (arg); | 278 | CHECK_NUMBER (arg); |
| 279 | 279 | ||
| 280 | if (FLOATP (arg)) | 280 | if (BIGNUMP (arg)) |
| 281 | { | ||
| 282 | mpz_t val; | ||
| 283 | mpz_init (val); | ||
| 284 | mpz_abs (val, XBIGNUM (arg)->value); | ||
| 285 | arg = make_number (val); | ||
| 286 | mpz_clear (val); | ||
| 287 | } | ||
| 288 | else if (FIXNUMP (arg) && XINT (arg) == MOST_NEGATIVE_FIXNUM) | ||
| 289 | { | ||
| 290 | mpz_t val; | ||
| 291 | mpz_init_set_si (val, - MOST_NEGATIVE_FIXNUM); | ||
| 292 | arg = make_number (val); | ||
| 293 | mpz_clear (val); | ||
| 294 | } | ||
| 295 | else if (FLOATP (arg)) | ||
| 281 | arg = make_float (fabs (XFLOAT_DATA (arg))); | 296 | arg = make_float (fabs (XFLOAT_DATA (arg))); |
| 282 | else if (XINT (arg) < 0) | 297 | else if (XINT (arg) < 0) |
| 283 | XSETINT (arg, - XINT (arg)); | 298 | XSETINT (arg, - XINT (arg)); |