44 namespace approx_math {
79 return float(0x2.p0) +
y * (float(0x2.07b99p0) +
y * float(0x1.025b84p0)) ;
84 #ifdef HORNER // HORNER
85 return float(0x2.p0) +
y * (float(0x1.fff798p0) +
y * (float(0x1.02249p0) +
y * float(0x5.62042p-4))) ;
87 float p23 = (float(0x1.02249p0) +
y * float(0x5.62042p-4)) ;
88 float p01 = float(0x2.p0) +
y * float(0x1.fff798p0);
95 return float(0x2.p0) +
y * (float(0x1.fffb1p0) +
y * (float(0xf.ffe84p-4) +
y * (float(0x5.5f9c1p-4) +
y * float(0x1.57755p-4)))) ;
100 return float(0x2.p0) +
y * (float(0x2.p0) +
y * (float(0xf.ffed8p-4) +
y * (float(0x5.5551cp-4) +
y * (float(0x1.5740d8p-4) +
y * float(0x4.49368p-8))))) ;
105 #ifdef HORNER // HORNER
106 float p = float(0x2.p0) +
y * (float(0x2.p0) +
y * (float(0x1.p0) +
y * (float(0x5.55523p-4) +
y * (float(0x1.5554dcp-4) +
y * (float(0x4.48f41p-8) +
y * float(0xb.6ad4p-12)))))) ;
107 #else // ESTRIN does seem to save a cycle or two
108 float p56 = float(0x4.48f41p-8) +
y * float(0xb.6ad4p-12);
109 float p34 = float(0x5.55523p-4) +
y * float(0x1.5554dcp-4);
111 float p12 = float(0x2.p0) +
y;
112 float p36 = p34 + y2*p56;
113 float p16 = p12 + y2*p36;
114 float p = float(0x2.p0) + y*p16;
122 return float(0x2.p0) +
y * (float(0x2.p0) +
y * (float(0x1.p0) +
y * (float(0x5.55555p-4) +
y * (float(0x1.5554e4p-4) +
y * (float(0x4.444adp-8) +
y * (float(0xb.6a8a6p-12) +
y * float(0x1.9ec814p-12))))))) ;
150 using namespace approx_math;
161 constexpr float inv_log2f = float(0x1.715476p0);
162 constexpr float log2H = float(0xb.172p-4);
163 constexpr float log2L = float(0x1.7f7d1cp-20);
168 float z =
fpfloor((x*inv_log2f) +0.5
f);
184 float p = approx_expf_P<DEGREE>(y);
188 uint32_t biased_exponent=
e+127;
189 ef.ui32=(biased_exponent<<23);
195 #ifndef NO_APPROX_MATH
199 return unsafe_expf_impl<DEGREE>(
x);
205 constexpr float inf_threshold =float(0x5.8b90cp4);
207 constexpr float zero_threshold_ftz =-float(0x5.75628p4);
212 float r = unsafe_expf<DEGREE>(
x);
227 #endif // NO_APPROX_MATH
float approx_expf_P< 2 >(float y)
float approx_expf_P(float p)
float approx_expf_P< 5 >(float y)
float approx_expf_P< 3 >(float y)
float approx_expf_P< 6 >(float y)
T x() const
Cartesian x coordinate.
float unsafe_expf_impl(float x)
float unsafe_expf(float x)
float approx_expf_P< 4 >(float y)
float approx_expf_P< 7 >(float y)
float approx_expf(float x)