summaryrefslogtreecommitdiff
path: root/src/floatfns.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2011-10-06 00:51:21 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2011-10-06 00:51:21 -0700
commit8d1da888c6f3c6763c7e6e73a5bdd3bf997d0cfc (patch)
treec34676d36a1f213d2c3bb70c164941ae085eb41f /src/floatfns.c
parentdf52aeb91d63c3f904c717fa8897e59fd9a5a557 (diff)
downloademacs-8d1da888c6f3c6763c7e6e73a5bdd3bf997d0cfc.tar.gz
* floatfns.c (Fexpt): Avoid unnecessary multiplications.
Diffstat (limited to 'src/floatfns.c')
-rw-r--r--src/floatfns.c23
1 files changed, 5 insertions, 18 deletions
diff --git a/src/floatfns.c b/src/floatfns.c
index 6158b9bd26d..f8b775011ae 100644
--- a/src/floatfns.c
+++ b/src/floatfns.c
@@ -490,26 +490,13 @@ DEFUN ("expt", Fexpt, Sexpt, 2, 2, 0,
x = XINT (arg1);
y = XINT (arg2);
- acc = 1;
+ acc = (y & 1 ? x : 1);
- if (y < 0)
+ while ((y >>= 1) != 0)
{
- if (x == 1)
- acc = 1;
- else if (x == -1)
- acc = (y & 1) ? -1 : 1;
- else
- acc = 0;
- }
- else
- {
- while (y > 0)
- {
- if (y & 1)
- acc *= x;
- x *= x;
- y >>= 1;
- }
+ x *= x;
+ if (y & 1)
+ acc *= x;
}
XSETINT (val, acc);
return val;