diff options
author | tlatorre <tlatorre@uchicago.edu> | 2019-06-02 13:28:36 -0400 |
---|---|---|
committer | tlatorre <tlatorre@uchicago.edu> | 2019-06-02 13:28:36 -0400 |
commit | 98c663f379d5acec1656924e26cd3e5c9c9984d5 (patch) | |
tree | ece8d4ce1eefc442ebe256345301b756fdd5eb68 /src/misc.c | |
parent | 2f2cd1797190335468e956f4c286c6e4de27518e (diff) | |
download | sddm-98c663f379d5acec1656924e26cd3e5c9c9984d5.tar.gz sddm-98c663f379d5acec1656924e26cd3e5c9c9984d5.tar.bz2 sddm-98c663f379d5acec1656924e26cd3e5c9c9984d5.zip |
add a fast sqrt function for values in between 0 and 1
Diffstat (limited to 'src/misc.c')
-rw-r--r-- | src/misc.c | 22 |
1 files changed, 22 insertions, 0 deletions
@@ -881,3 +881,25 @@ double fast_acos(double x) return interp1d(x,xs,ys,LEN(xs)); } + +/* Fast version of sqrt() for `x` between 0 and 1 which uses a lookup table + * computed on the first call. */ +double fast_sqrt(double x) +{ + size_t i; + static int initialized = 0; + static double xs[N_SQRT]; + static double ys[N_SQRT]; + + if (!initialized) { + for (i = 0; i < LEN(xs); i++) { + xs[i] = 1.0*i/(LEN(xs)-1); + ys[i] = sqrt(xs[i]); + } + initialized = 1; + } + + if (x > 1.0) return sqrt(x); + + return interp1d(x,xs,ys,LEN(xs)); +} |