diff options
Diffstat (limited to 'src/fns.c')
| -rw-r--r-- | src/fns.c | 12 |
1 files changed, 5 insertions, 7 deletions
| @@ -1468,19 +1468,17 @@ DEFUN ("nthcdr", Fnthcdr, Snthcdr, 2, 2, 0, | |||
| 1468 | /* Undo any error introduced when LARGE_NUM was substituted for | 1468 | /* Undo any error introduced when LARGE_NUM was substituted for |
| 1469 | N, by adding N - LARGE_NUM to NUM, using arithmetic modulo | 1469 | N, by adding N - LARGE_NUM to NUM, using arithmetic modulo |
| 1470 | CYCLE_LENGTH. */ | 1470 | CYCLE_LENGTH. */ |
| 1471 | mpz_t z; /* N mod CYCLE_LENGTH. */ | 1471 | /* Add N mod CYCLE_LENGTH to NUM. */ |
| 1472 | mpz_init (z); | ||
| 1473 | if (cycle_length <= ULONG_MAX) | 1472 | if (cycle_length <= ULONG_MAX) |
| 1474 | num += mpz_mod_ui (z, XBIGNUM (n)->value, cycle_length); | 1473 | num += mpz_mod_ui (mpz[0], XBIGNUM (n)->value, cycle_length); |
| 1475 | else | 1474 | else |
| 1476 | { | 1475 | { |
| 1477 | mpz_set_intmax (z, cycle_length); | 1476 | mpz_set_intmax (mpz[0], cycle_length); |
| 1478 | mpz_mod (z, XBIGNUM (n)->value, z); | 1477 | mpz_mod (mpz[0], XBIGNUM (n)->value, mpz[0]); |
| 1479 | intptr_t iz; | 1478 | intptr_t iz; |
| 1480 | mpz_export (&iz, NULL, -1, sizeof iz, 0, 0, z); | 1479 | mpz_export (&iz, NULL, -1, sizeof iz, 0, 0, mpz[0]); |
| 1481 | num += iz; | 1480 | num += iz; |
| 1482 | } | 1481 | } |
| 1483 | mpz_clear (z); | ||
| 1484 | num += cycle_length - large_num % cycle_length; | 1482 | num += cycle_length - large_num % cycle_length; |
| 1485 | } | 1483 | } |
| 1486 | num %= cycle_length; | 1484 | num %= cycle_length; |