EXP-063: test the mode-independent mantissa bound before the rounds_to_nearest probe

This commit is contained in:
fcostaoliveira 2026-07-03 14:15:29 +01:00
parent f4f36e04f7
commit 5082489e35

View File

@ -198,7 +198,14 @@ clinger_fast_path_impl(uint64_t mantissa, int64_t exponent, bool is_negative,
// We proceed optimistically, assuming that detail::rounds_to_nearest()
// returns true.
if (binary_format<T>::min_exponent_fast_path() <= exponent &&
exponent <= binary_format<T>::max_exponent_fast_path()) {
exponent <= binary_format<T>::max_exponent_fast_path() &&
mantissa <= binary_format<T>::max_mantissa_fast_path()) {
// The mantissa bound above is a necessary condition for BOTH branches
// below: the rounding-mode-dependent branch checks the tighter
// max_mantissa_fast_path(exponent) <= max_mantissa_fast_path(). Testing
// it before detail::rounds_to_nearest() spares long-mantissa inputs
// (which can never take the fast path) the volatile-float probe.
//
// Unfortunately, the conventional Clinger's fast path is only possible
// when the system rounds to the nearest float.
//
@ -209,7 +216,6 @@ clinger_fast_path_impl(uint64_t mantissa, int64_t exponent, bool is_negative,
if (!cpp20_and_in_constexpr() && detail::rounds_to_nearest()) {
// We have that fegetround() == FE_TONEAREST.
// Next is Clinger's fast path.
if (mantissa <= binary_format<T>::max_mantissa_fast_path()) {
value = T(mantissa);
if (exponent < 0) {
value = value / binary_format<T>::exact_power_of_ten(-exponent);
@ -220,7 +226,6 @@ clinger_fast_path_impl(uint64_t mantissa, int64_t exponent, bool is_negative,
value = -value;
}
return true;
}
} else {
// We do not have that fegetround() == FE_TONEAREST.
// Next is a modified Clinger's fast path, inspired by Jakub Jelínek's