From f6819755779a084bf2f82cb90175a4d9a018de73 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Mon, 30 Apr 2012 03:26:53 -0400 Subject: first try at writing an efficient and "correct" exp10 this is a nonstandard function so it's not clear what conditions it should satisfy. my intent is that it be fast and exact for positive integral exponents when the result fits in the destination type, and fast and correctly rounded for small negative integral exponents. otherwise we aim for at most 1ulp error; it seems to differ from pow by at most 1ulp and it's often 2-5 times faster than pow. --- src/math/exp10f.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/math/exp10f.c (limited to 'src/math/exp10f.c') diff --git a/src/math/exp10f.c b/src/math/exp10f.c new file mode 100644 index 00000000..c9521411 --- /dev/null +++ b/src/math/exp10f.c @@ -0,0 +1,17 @@ +#define _GNU_SOURCE +#include + +float exp10f(float x) +{ + static const float p10[] = { + 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1, + 1, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7 + }; + float n, y = modff(x, &n); + if (fabsf(n) < 8) { + if (!y) return p10[(int)n+7]; + y = exp2f(3.32192809488736234787031942948939f * y); + return y * p10[(int)n+7]; + } + return exp2(3.32192809488736234787031942948939 * x); +} -- cgit v1.2.1