From cc598bb6206f28d3064c17256d23245baf23a521 Mon Sep 17 00:00:00 2001 From: Dirk Zimoch Date: Wed, 2 May 2018 14:49:16 +0200 Subject: [PATCH] optimize ** (power) operator --- expr.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/expr.c b/expr.c index e56ed20..40d1c30 100644 --- a/expr.c +++ b/expr.c @@ -66,12 +66,16 @@ static int parseValue(const char **pp, long *v) static long ipow(long base, long exp) { - long v; - if (exp < 0) return 0; + long val; + if (exp == 2) return base*base; + if (exp == 3) return base*base*base; + if (exp == 1) return base; if (exp == 0) return 1; - v = base; - while (--exp) v *= base; /* optimize this! */ - return v; + if (exp < 0) return 0; + val = ipow(base,exp>>1); + val *= val; + if (exp&1) val *= base; + return val; } static char parseSep(const char **pp, const char *seps)