diff options
Diffstat (limited to 'src/floatfns.c')
| -rw-r--r-- | src/floatfns.c | 46 |
1 files changed, 17 insertions, 29 deletions
diff --git a/src/floatfns.c b/src/floatfns.c index 5c286772864..1232fc0afa1 100644 --- a/src/floatfns.c +++ b/src/floatfns.c | |||
| @@ -491,39 +491,27 @@ DEFUN ("expt", Fexpt, Sexpt, 2, 2, 0, | |||
| 491 | y = XINT (arg2); | 491 | y = XINT (arg2); |
| 492 | acc = 1; | 492 | acc = 1; |
| 493 | 493 | ||
| 494 | if ((x == 0 && y != 0) || x == 1 || (x == -1 && (y & 1))) | 494 | if (y < 0) |
| 495 | return arg1; | ||
| 496 | if (x == -1) | ||
| 497 | y = 0; | ||
| 498 | |||
| 499 | while (1) | ||
| 500 | { | 495 | { |
| 501 | if (y & 1) | 496 | if (x == 1) |
| 502 | { | 497 | acc = 1; |
| 503 | if (x < 0 | 498 | else if (x == -1) |
| 504 | ? (acc < 0 | 499 | acc = (y & 1) ? -1 : 1; |
| 505 | ? acc < MOST_POSITIVE_FIXNUM / x | 500 | else |
| 506 | : MOST_NEGATIVE_FIXNUM / x < acc) | 501 | acc = 0; |
| 507 | : (acc < 0 | 502 | } |
| 508 | ? acc < MOST_NEGATIVE_FIXNUM / x | 503 | else |
| 509 | : MOST_POSITIVE_FIXNUM / x < acc)) | 504 | { |
| 510 | break; | 505 | while (y > 0) |
| 511 | acc *= x; | ||
| 512 | } | ||
| 513 | |||
| 514 | y >>= 1; | ||
| 515 | if (y == 0) | ||
| 516 | { | 506 | { |
| 517 | XSETINT (val, acc); | 507 | if (y & 1) |
| 518 | return val; | 508 | acc *= x; |
| 509 | x *= x; | ||
| 510 | y = (unsigned)y >> 1; | ||
| 519 | } | 511 | } |
| 520 | |||
| 521 | if (x < 0 | ||
| 522 | ? x < MOST_POSITIVE_FIXNUM / x | ||
| 523 | : MOST_POSITIVE_FIXNUM / x < x) | ||
| 524 | break; | ||
| 525 | x *= x; | ||
| 526 | } | 512 | } |
| 513 | XSETINT (val, acc); | ||
| 514 | return val; | ||
| 527 | } | 515 | } |
| 528 | f1 = FLOATP (arg1) ? XFLOAT_DATA (arg1) : XINT (arg1); | 516 | f1 = FLOATP (arg1) ? XFLOAT_DATA (arg1) : XINT (arg1); |
| 529 | f2 = FLOATP (arg2) ? XFLOAT_DATA (arg2) : XINT (arg2); | 517 | f2 = FLOATP (arg2) ? XFLOAT_DATA (arg2) : XINT (arg2); |