}
NormalFloat<T> normal(bits);
- return normal.exponent;
+ return static_cast<T>(normal.exponent);
}
template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0>
}
// For all other cases, if `x` can fit in the integer type `I`,
- // we just return `x`. Implicit conversion will convert the
- // floating point value to the exact integer value.
- return x;
+ // we just return `x`. static_cast will convert the floating
+ // point value to the exact integer value.
+ return static_cast<I>(x);
}
} // namespace internal
return r.value();
double xd = static_cast<double>(x);
- return fputil::multiply_add(-0x1.5555555555555p-3 * xd, xd * xd,
- M_MATH_PI_2 - xd);
+ return static_cast<float>(fputil::multiply_add(
+ -0x1.5555555555555p-3 * xd, xd * xd, M_MATH_PI_2 - xd));
}
// For |x| <= 0.5, we approximate acosf(x) by:
double xsq = xd * xd;
double x3 = xd * xsq;
double r = asin_eval(xsq);
- return fputil::multiply_add(-x3, r, M_MATH_PI_2 - xd);
+ return static_cast<float>(fputil::multiply_add(-x3, r, M_MATH_PI_2 - xd));
}
// |x| > 1, return NaNs.
double r3 = asin_eval(u);
double r = fputil::multiply_add(cv * u, r3, cv);
- return x_sign ? M_MATH_PI - r : r;
+ return static_cast<float>(x_sign ? M_MATH_PI - r : r);
}
} // namespace __llvm_libc
double x_d = static_cast<double>(x);
// acosh(x) = log(x + sqrt(x^2 - 1))
- return log_eval(x_d + fputil::sqrt(fputil::multiply_add(x_d, x_d, -1.0)));
+ return static_cast<float>(
+ log_eval(x_d + fputil::sqrt(fputil::multiply_add(x_d, x_d, -1.0))));
}
} // namespace __llvm_libc
double xsq = xd * xd;
double x3 = xd * xsq;
double r = asin_eval(xsq);
- return fputil::multiply_add(x3, r, xd);
+ return static_cast<float>(fputil::multiply_add(x3, r, xd));
}
// |x| > 1, return NaNs.
double c3 = c1 * u;
double r = asin_eval(u);
- return fputil::multiply_add(c3, r, c2);
+ return static_cast<float>(fputil::multiply_add(c3, r, c2));
}
} // namespace __llvm_libc
if (LIBC_UNLIKELY(x_abs <= 0x3e80'0000U)) {
// |x| <= 2^-26
if (LIBC_UNLIKELY(x_abs <= 0x3280'0000U)) {
- return LIBC_UNLIKELY(x_abs == 0) ? x
- : (x - 0x1.5555555555555p-3 * x * x * x);
+ return static_cast<float>(LIBC_UNLIKELY(x_abs == 0)
+ ? x
+ : (x - 0x1.5555555555555p-3 * x * x * x));
}
double x_d = x;
x_sq, 0.0, -0x1.555555555551ep-3, 0x1.3333333325495p-4,
-0x1.6db6db5a7622bp-5, 0x1.f1c70f82928c6p-6, -0x1.6e893934266b7p-6,
0x1.1c0b41d3fbe78p-6, -0x1.c0f47810b3c4fp-7, 0x1.2c8602690143dp-7);
- return fputil::multiply_add(x_d, p, x_d);
+ return static_cast<float>(fputil::multiply_add(x_d, p, x_d));
}
const double SIGN[2] = {1.0, -1.0};
}
// asinh(x) = log(x + sqrt(x^2 + 1))
- return x_sign *
- log_eval(fputil::multiply_add(
- x_d, x_sign, fputil::sqrt(fputil::multiply_add(x_d, x_d, 1.0))));
+ return static_cast<float>(
+ x_sign *
+ log_eval(fputil::multiply_add(
+ x_d, x_sign, fputil::sqrt(fputil::multiply_add(x_d, x_d, 1.0)))));
}
} // namespace __llvm_libc
if (LIBC_UNLIKELY(xbits.is_inf_or_nan())) {
if (xbits.is_inf())
- return opt_barrier(sign ? -M_MATH_PI_2 : M_MATH_PI_2);
+ return static_cast<float>(opt_barrier(sign ? -M_MATH_PI_2 : M_MATH_PI_2));
else
return x;
}
}
}
- return atan_eval(x);
+ return static_cast<float>(atan_eval(x));
}
} // namespace __llvm_libc
if (LIBC_UNLIKELY(x_abs <= 0x3dcc'0000U)) {
// |x| <= 2^-26
if (LIBC_UNLIKELY(x_abs <= 0x3280'0000U)) {
- return LIBC_UNLIKELY(x_abs == 0) ? x
- : (x + 0x1.5555555555555p-2 * x * x * x);
+ return static_cast<float>(LIBC_UNLIKELY(x_abs == 0)
+ ? x
+ : (x + 0x1.5555555555555p-2 * x * x * x));
}
double xdbl = x;
double pe = fputil::polyeval(x2, 0.0, 0x1.5555555555555p-2,
0x1.999999999999ap-3, 0x1.2492492492492p-3,
0x1.c71c71c71c71cp-4, 0x1.745d1745d1746p-4);
- return fputil::multiply_add(xdbl, pe, xdbl);
+ return static_cast<float>(fputil::multiply_add(xdbl, pe, xdbl));
}
double xdbl = x;
- return 0.5 * log_eval((xdbl + 1.0) / (xdbl - 1.0));
+ return static_cast<float>(0.5 * log_eval((xdbl + 1.0) / (xdbl - 1.0)));
}
} // namespace __llvm_libc
sincosf_eval(xd, x_abs, sin_k, cos_k, sin_y, cosm1_y);
- return fputil::multiply_add(sin_y, -sin_k,
- fputil::multiply_add(cosm1_y, cos_k, cos_k));
+ return static_cast<float>(fputil::multiply_add(
+ sin_y, -sin_k, fputil::multiply_add(cosm1_y, cos_k, cos_k)));
}
} // namespace __llvm_libc
// but not too small inputs, such as |x| < 2^-2, or |x| < 2^-3.
// cosh(x) = (e^x + e^(-x)) / 2.
- return exp_pm_eval</*is_sinh*/ false>(x);
+ return static_cast<float>(exp_pm_eval</*is_sinh*/ false>(x));
}
} // namespace __llvm_libc
return fputil::multiply_add(x, 0x1.26bb1cp+1f, 1.0f);
}
- return Exp10Base::powb_lo(x);
+ return static_cast<float>(Exp10Base::powb_lo(x));
}
// Exceptional value.
// 10^x = 2^(mid + hi) * 10^lo
// ~ mh * (c0 + p * lo^2)
// = (mh * c0) + p * (mh * lo^2)
- return multiply_add(p, lo2 * rr.mh, c0 * rr.mh);
+ return static_cast<float>(multiply_add(p, lo2 * rr.mh, c0 * rr.mh));
}
} // namespace __llvm_libc
// = 2^(hi + mid) * 2^lo
// ~ mh * (1 + lo * P(lo))
// = mh + (mh*lo) * P(lo)
- return fputil::multiply_add(p, dx_sq * mh, c1 * mh);
+ return static_cast<float>(fputil::multiply_add(p, dx_sq * mh, c1 * mh));
}
} // namespace __llvm_libc
// |R * x_m - 1| < C
uint64_t x_u = xbits.uintval();
int shifted = x_u >> 45;
- size_t index = shifted & 0x7F;
+ int index = shifted & 0x7F;
double r = R[index];
x_e += (x_u >> 52) & 0x7FF;
double c2 = fputil::multiply_add(xd, COEFFS[5], COEFFS[4]);
double r = fputil::polyeval(xsq, xd, c0, c1, c2, COEFFS[6]);
- return r;
+ return static_cast<float>(r);
}
} // namespace __llvm_libc
sincosf_eval(xd, x_abs, sin_k, cos_k, sin_y, cosm1_y);
- *sinp = fputil::multiply_add(sin_y, cos_k,
- fputil::multiply_add(cosm1_y, sin_k, sin_k));
- *cosp = fputil::multiply_add(sin_y, -sin_k,
- fputil::multiply_add(cosm1_y, cos_k, cos_k));
+ *sinp = static_cast<float>(fputil::multiply_add(
+ sin_y, cos_k, fputil::multiply_add(cosm1_y, sin_k, sin_k)));
+ *cosp = static_cast<float>(fputil::multiply_add(
+ sin_y, -sin_k, fputil::multiply_add(cosm1_y, cos_k, cos_k)));
}
} // namespace __llvm_libc
double result =
fputil::polyeval(xsq, 1.0, -0x1.55555555554c6p-3, 0x1.1111111085e65p-7,
-0x1.a019f70fb4d4fp-13, 0x1.718d179815e74p-19);
- return xd * result;
+ return static_cast<float>(xd * result);
}
if (LIBC_UNLIKELY(x_abs == 0x4619'9998U)) { // x = 0x1.33333p13
sincosf_eval(xd, x_abs, sin_k, cos_k, sin_y, cosm1_y);
- return fputil::multiply_add(sin_y, cos_k,
- fputil::multiply_add(cosm1_y, sin_k, sin_k));
+ return static_cast<float>(fputil::multiply_add(
+ sin_y, cos_k, fputil::multiply_add(cosm1_y, sin_k, sin_k)));
}
} // namespace __llvm_libc
// |x| <= 2^-26
if (LIBC_UNLIKELY(x_abs <= 0x3280'0000U)) {
- return LIBC_UNLIKELY(x_abs == 0) ? x : (x + 0.25 * x * x * x);
+ return static_cast<float>(
+ LIBC_UNLIKELY(x_abs == 0) ? x : (x + 0.25 * x * x * x));
}
// When |x| >= 90, or x is inf or nan
// Therefore, output of Sollya = x * pe;
double pe = fputil::polyeval(x2, 0.0, 0x1.5555555556583p-3,
0x1.111110d239f1fp-7, 0x1.a02b5a284013cp-13);
- return fputil::multiply_add(xdbl, pe, xdbl);
+ return static_cast<float>(fputil::multiply_add(xdbl, pe, xdbl));
}
// sinh(x) = (e^x - e^(-x)) / 2.
- return exp_pm_eval</*is_sinh*/ true>(x);
+ return static_cast<float>(exp_pm_eval</*is_sinh*/ true>(x));
}
} // namespace __llvm_libc
double result =
fputil::polyeval(xsq, 1.0, 0x1.555555553d022p-2, 0x1.111111ce442c1p-3,
0x1.ba180a6bbdecdp-5, 0x1.69c0a88a0b71fp-6);
- return xd * result;
+ return static_cast<float>(xd * result);
}
// Check for exceptional values
// tan(x) = sin(x) / cos(x)
// = (sin_y * cos_k + cos_y * sin_k) / (cos_y * cos_k - sin_y * sin_k)
using fputil::multiply_add;
- return multiply_add(sin_y, cos_k, multiply_add(cosm1_y, sin_k, sin_k)) /
- multiply_add(sin_y, -sin_k, multiply_add(cosm1_y, cos_k, cos_k));
+ return static_cast<float>(
+ multiply_add(sin_y, cos_k, multiply_add(cosm1_y, sin_k, sin_k)) /
+ multiply_add(sin_y, -sin_k, multiply_add(cosm1_y, cos_k, cos_k)));
}
} // namespace __llvm_libc
// |x| <= 2^-26
if (LIBC_UNLIKELY(x_abs <= 0x3280'0000U)) {
- return LIBC_UNLIKELY(x_abs == 0) ? x
- : (x - 0x1.5555555555555p-2 * x * x * x);
+ return static_cast<float>(
+ LIBC_UNLIKELY(x_abs == 0) ? x : (x - 0x1.5555555555555p-2 * x * x * x));
}
// When |x| >= 15, or x is inf or nan
double pe = fputil::polyeval(x2, 0.0, -0x1.5555555555555p-2,
0x1.1111111111111p-3, -0x1.ba1ba1ba1ba1cp-5,
0x1.664f4882c10fap-6, -0x1.226e355e6c23dp-7);
- return fputil::multiply_add(xdbl, pe, xdbl);
+ return static_cast<float>(fputil::multiply_add(xdbl, pe, xdbl));
}
if (LIBC_UNLIKELY(xbits.bits == 0x4058'e0a3U)) {
fputil::multiply_add(ep.mh, r, 1.0);
#else
double exp_x = ep.mh * r;
- return (exp_x - 1.0) / (exp_x + 1.0);
+ return static_cast<float>((exp_x - 1.0) / (exp_x + 1.0));
#endif // LIBC_TARGET_CPU_HAS_FMA
}