aboutsummaryrefslogtreecommitdiffstats
path: root/src/floatfns.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/floatfns.c')
-rw-r--r--src/floatfns.c46
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);