Skip to content

Commit 789c2e1

Browse files
committed
Deal with constexpr abs() all over
1 parent cf408fd commit 789c2e1

File tree

3 files changed

+18
-9
lines changed

3 files changed

+18
-9
lines changed

include/boost/decimal/charconv.hpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,9 @@ BOOST_DECIMAL_CONSTEXPR auto to_chars_scientific_impl(char* first, char* last, c
318318

319319
// Insert the exponent character
320320
*first++ = 'e';
321-
const int abs_exp {std::abs(exp)};
321+
322+
const int abs_exp { (exp < 0) ? -exp : exp };
323+
322324
if (exp < 0)
323325
{
324326
*first++ = '-';
@@ -383,7 +385,9 @@ BOOST_DECIMAL_CONSTEXPR auto to_chars_fixed_impl(char* first, char* last, const
383385

384386
if (integer_digits < 0)
385387
{
386-
num_leading_zeros = std::abs(integer_digits);
388+
const int abs_integer_digits { (integer_digits < 0) ? -integer_digits : integer_digits };
389+
390+
num_leading_zeros = abs_integer_digits;
387391
integer_digits = 0;
388392
append_leading_zeros = true;
389393
}
@@ -683,12 +687,16 @@ BOOST_DECIMAL_CONSTEXPR auto to_chars_hex_impl(char* first, char* last, const Ta
683687
*first++ = '+';
684688
}
685689

686-
if (std::abs(exp) < 10)
690+
const int abs_exp { (exp < 0) ? -exp : exp };
691+
692+
if (abs_exp < 10)
687693
{
688694
*first++ = '0';
689695
}
690696

691-
return to_chars_integer_impl<std::uint32_t, std::uint32_t>(first, last, static_cast<std::uint32_t>(std::abs(exp)), 10);
697+
const int abs_exp { (exp < 0) ? -exp : exp };
698+
699+
return to_chars_integer_impl<std::uint32_t, std::uint32_t>(first, last, static_cast<std::uint32_t>(abs_exp), 10);
692700
}
693701

694702
template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE TargetDecimalType>

include/boost/decimal/detail/cmath/pow.hpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -245,12 +245,10 @@ constexpr auto pow(T x, T a) noexcept
245245
}
246246
else if (fpc_a == FP_INFINITE)
247247
{
248-
using std::abs;
249-
250248
result =
251249
(
252-
(abs(x) < one) ? (signbit(a) ? std::numeric_limits<T>::infinity() : zero)
253-
: (abs(x) > one) ? (signbit(a) ? zero : std::numeric_limits<T>::infinity())
250+
(fabs(x) < one) ? (signbit(a) ? std::numeric_limits<T>::infinity() : zero)
251+
: (fabs(x) > one) ? (signbit(a) ? zero : std::numeric_limits<T>::infinity())
254252
: one
255253
);
256254
}

include/boost/decimal/detail/cmath/rint.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@ constexpr auto rint_impl(T1& sig, T2 exp, bool sign)
3434
using RoundType = std::conditional_t<std::is_same<T1, std::uint32_t>::value, decimal32,
3535
std::conditional_t<std::is_same<T1, std::uint64_t>::value, decimal64, decimal128>>;
3636

37-
sig /= detail::pow10(static_cast<T1>(std::abs(exp) - 1));
37+
const T2 abs_exp { (exp < T2(0)) ? -exp : exp };
38+
39+
sig /= detail::pow10(static_cast<T1>(abs_exp - 1));
40+
3841
detail::fenv_round<RoundType>(sig, sign);
3942
}
4043

0 commit comments

Comments
 (0)