blob: 7a8d447033eb73d7456cff6ab95d813f28e015ca [file] [log] [blame]
Rich Felkerf6819752012-04-30 03:26:53 -04001#define _GNU_SOURCE
2#include <math.h>
Szabolcs Nagy18daae32014-09-18 17:02:24 +02003#include <stdint.h>
Rich Felkera917c032012-05-01 00:07:37 -04004#include "libc.h"
Rich Felkerf6819752012-04-30 03:26:53 -04005
6float exp10f(float x)
7{
8 static const float p10[] = {
Szabolcs Nagya764db92012-11-18 03:52:29 +01009 1e-7f, 1e-6f, 1e-5f, 1e-4f, 1e-3f, 1e-2f, 1e-1f,
Rich Felkerf6819752012-04-30 03:26:53 -040010 1, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7
11 };
12 float n, y = modff(x, &n);
Szabolcs Nagy18daae32014-09-18 17:02:24 +020013 union {float f; uint32_t i;} u = {n};
14 /* fabsf(n) < 8 without raising invalid on nan */
15 if ((u.i>>23 & 0xff) < 0x7f+3) {
Rich Felkerf6819752012-04-30 03:26:53 -040016 if (!y) return p10[(int)n+7];
17 y = exp2f(3.32192809488736234787031942948939f * y);
18 return y * p10[(int)n+7];
19 }
20 return exp2(3.32192809488736234787031942948939 * x);
21}
Rich Felkera917c032012-05-01 00:07:37 -040022
23weak_alias(exp10f, pow10f);