summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrilysh <nightquick@proton.me>2024-02-17 21:26:02 +0530
committerGitHub <noreply@github.com>2024-02-17 16:56:02 +0100
commit715567d03771c437e26b16fbc71c30c4474b8895 (patch)
tree49ba1409392d8b50d06c654b5c8f6aff38f25c90
parent97eff26d0ca4d187a5efb8534af484dbb68bce30 (diff)
[libc++] simplify the midpoint function (#81717)
Right now we've a nested ternary for the midpoint function, but this can be simplified a bit more, using if statements. This also slightly increases the readability of that function.
-rw-r--r--libcxx/include/__numeric/midpoint.h18
1 files changed, 10 insertions, 8 deletions
diff --git a/libcxx/include/__numeric/midpoint.h b/libcxx/include/__numeric/midpoint.h
index 5d715c21d8ea..5ef30d4ec50f 100644
--- a/libcxx/include/__numeric/midpoint.h
+++ b/libcxx/include/__numeric/midpoint.h
@@ -67,14 +67,16 @@ template <class _Fp>
_LIBCPP_HIDE_FROM_ABI constexpr enable_if_t<is_floating_point_v<_Fp>, _Fp> midpoint(_Fp __a, _Fp __b) noexcept {
constexpr _Fp __lo = numeric_limits<_Fp>::min() * 2;
constexpr _Fp __hi = numeric_limits<_Fp>::max() / 2;
- return std::__fp_abs(__a) <= __hi && std::__fp_abs(__b) <= __hi
- ? // typical case: overflow is impossible
- (__a + __b) / 2
- : // always correctly rounded
- std::__fp_abs(__a) < __lo ? __a + __b / 2 : // not safe to halve a
- std::__fp_abs(__b) < __lo ? __a / 2 + __b
- : // not safe to halve b
- __a / 2 + __b / 2; // otherwise correctly rounded
+
+ // typical case: overflow is impossible
+ if (std::__fp_abs(__a) <= __hi && std::__fp_abs(__b) <= __hi)
+ return (__a + __b) / 2; // always correctly rounded
+ if (std::__fp_abs(__a) < __lo)
+ return __a + __b / 2; // not safe to halve a
+ if (std::__fp_abs(__b) < __lo)
+ return __a / 2 + __b; // not safe to halve b
+
+ return __a / 2 + __b / 2; // otherwise correctly rounded
}
#endif // _LIBCPP_STD_VER >= 20