mirror of
https://github.com/fastfloat/fast_float.git
synced 2026-07-30 16:26:21 +08:00
EXP-063: test the mode-independent mantissa bound before the rounds_to_nearest probe
This commit is contained in:
parent
f4f36e04f7
commit
5082489e35
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user