aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Weigt <juw@posteo.de>2026-02-09 13:46:33 +0100
committerJulian Weigt <juw@posteo.de>2026-02-09 14:12:11 +0100
commitb9f353f966ffa48dd0179c3ab3eb73e9feb9940e (patch)
treeb4d5cb13e5b0519f46ab307f1ba05a3fb0c29c69
parent25ef88ad223b6c92106fb45658a98a1a4b95c4a2 (diff)
Don't invoke pow if exponent is 1. Also write routine to compute exponentials by multiplication if the exponent is integer.
-rw-r--r--double-error.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/double-error.c b/double-error.c
index 63c820f..5d08019 100644
--- a/double-error.c
+++ b/double-error.c
@@ -92,7 +92,17 @@ double_error absolute(double_error de){
return dea;
}
+double_error power_int(double_error de, double_error p){
+ if((int) p.v == 1) return de;
+
+ double_error pm = p;
+ pm.v--;
+ return product(power_int(de,pm),de);
+}
+
double_error power(double_error de, double_error p) {
+ //if(p.e == 0.0 && ((vtype) ((int) p.v) == p.v)) return power_int(de,p);
+ if(p.e == 0.0 && ((vtype) ((int) p.v) == p.v) && (int) p.v == 1) return de;
double_error dep;
dep.v = pow(de.v,p.v);
vtype dmin = (de.v - de.e)*(1-EPS);