From 4a8903e9c019bbd2c50a1074a979b311a5980307 Mon Sep 17 00:00:00 2001 From: Nicholas McKibben Date: Sat, 4 Feb 2023 22:14:37 -0700 Subject: [PATCH] FIX: avoid overflow on overflow check in halley_step on Apple M1 --- include/boost/math/tools/roots.hpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/include/boost/math/tools/roots.hpp b/include/boost/math/tools/roots.hpp index 6493e81228..5e4290703f 100644 --- a/include/boost/math/tools/roots.hpp +++ b/include/boost/math/tools/roots.hpp @@ -354,7 +354,12 @@ namespace detail { BOOST_MATH_INSTRUMENT_VARIABLE(denom); BOOST_MATH_INSTRUMENT_VARIABLE(num); - if ((fabs(num) < 1) && (fabs(denom) >= fabs(num) * tools::max_value())) + // denom/num overflows if: + // |denom| >= |num| * max_value + // RHS may overflow on Apple M1, so rearrange: + // |denom| * 1/max_value >= |num| + static const T inv_max_value = 1.0 / tools::max_value(); + if ((fabs(num) < 1) && (inv_max_value * fabs(denom) >= fabs(num))) { // possible overflow, use Newton step: delta = f0 / f1;