156 {
157
158
159 if (sizeof(double) == sizeof(float)) {
160 return static_cast<double>(
exp_reduced_(
static_cast<float>(
x)));
161 }
162 DoubleBits xb;
164 const u64 ax = xb.u & 0x7fffffffffffffffull;
165 if (ax >= 0x40862e42fefa39efull) {
166 if (ax > 0x7ff0000000000000ull)
return x;
167 if ((xb.u >> 63) == 0u) {
168 DoubleBits inf;
169 inf.u = 0x7ff0000000000000ull;
170 return inf.f;
171 }
172 if (ax >= 0x40874910d52d3052ull) return 0.0;
173 }
174 const double kMagic = 6755399441055744.0;
176 t.
f =
x * 1.44269504088896338700e+00 +
kMagic;
177 const int k =
static_cast<int>(
t.i - 0x4338000000000000ll);
178 const double kd =
t.f -
kMagic;
179
180
181
182
183 const double hi =
x - kd * 6.93147180369123816490e-01;
184 const double lo = kd * 1.90821492927058770002e-10;
185 const double r = hi - lo;
186 const double r2 = r * r;
187 const double c = r - r2 * (1.66666666666666019037e-01 +
188 r2 * (-2.77777777770155933842e-03 +
189 r2 * (6.61375632143793436117e-05 +
190 r2 * (-1.65339022054652515390e-06 +
191 r2 * 4.13813679705723846039e-08))));
192 const double p = 1.0 - ((lo - (r * c) / (2.0 - c)) - hi);
194}
float scale_pow2_(float p, int k) FL_NO_EXCEPT
float exp_reduced_(float x) FL_NO_EXCEPT
constexpr fl::u8 kMagic[4]