From b196bcccd384aa2855bfae63f49ec8aae0c0be82 Mon Sep 17 00:00:00 2001 From: ckormanyos Date: Thu, 3 Jul 2025 21:14:41 +0200 Subject: [PATCH] Rework some functions --- .../boost/multiprecision/cpp_dec_float.hpp | 68 ++++++++----------- 1 file changed, 30 insertions(+), 38 deletions(-) diff --git a/include/boost/multiprecision/cpp_dec_float.hpp b/include/boost/multiprecision/cpp_dec_float.hpp index 57584c0e..9d8a30ea 100644 --- a/include/boost/multiprecision/cpp_dec_float.hpp +++ b/include/boost/multiprecision/cpp_dec_float.hpp @@ -445,8 +445,6 @@ class cpp_dec_float return ((fpclass == cpp_dec_float_finite) && (data[0u] == 0u)); } - bool isone() const; - bool isone_minus() const; bool isint() const; bool isneg() const { return neg; } @@ -571,6 +569,17 @@ class cpp_dec_float // Inversion. cpp_dec_float& calculate_inv(); + bool isone() const + { + bool b_neg; + + const bool result_one_is_ok = is_one_or_minus_one(&b_neg); + + return (result_one_is_ok && (!b_neg)); + } + + bool is_one_or_minus_one(bool* p_sign) const; + void from_unsigned_long_long(const unsigned long long u); template & cpp_dec_float& cpp_dec_float::compare(const cpp_dec_floa if (iszero()) { // The value of *this is zero and v is either zero or non-zero. - return (v.iszero() ? 0 - : (v.neg ? 1 : -1)); + return (v.iszero() ? 0 : (v.neg ? 1 : -1)); } else if (v.iszero()) { @@ -1456,47 +1465,30 @@ int cpp_dec_float::compare(const cpp_dec_floa } template -bool cpp_dec_float::isone() const +bool cpp_dec_float::is_one_or_minus_one(bool* p_sign) const { // Check if the value of *this is identically 1 or very close to 1. - const bool not_negative_and_is_finite = ((!neg) && (isfinite)()); + if(p_sign != nullptr) + *p_sign = neg; - if (not_negative_and_is_finite) + if ((isfinite)()) { if ((data[0u] == static_cast(1u)) && (exp == static_cast(0))) { const typename array_type::const_iterator it_non_zero = std::find_if(data.begin(), data.end(), data_elem_is_non_zero_predicate); - return (it_non_zero == data.end()); + + const bool result_one_is_ok = (it_non_zero == data.end()); + + return result_one_is_ok; } else if ((data[0u] == static_cast(cpp_dec_float_elem_mask - 1)) && (exp == static_cast(-cpp_dec_float_elem_digits10))) { const typename array_type::const_iterator it_non_nine = std::find_if(data.begin(), data.end(), data_elem_is_non_nine_predicate); - return (it_non_nine == data.end()); - } - } - return false; -} + const bool result_one_is_ok = (it_non_nine == data.end()); -template -bool cpp_dec_float::isone_minus() const -{ - // Check if the value of *this is identically 1 or very close to 1. - - const bool is_negative_and_is_finite = (neg && (isfinite)()); - - if (is_negative_and_is_finite) - { - if ((data[0u] == static_cast(1u)) && (exp == static_cast(0))) - { - const typename array_type::const_iterator it_non_zero = std::find_if(data.begin(), data.end(), data_elem_is_non_zero_predicate); - return (it_non_zero == data.end()); - } - else if ((data[0u] == static_cast(cpp_dec_float_elem_mask - 1)) && (exp == static_cast(-cpp_dec_float_elem_digits10))) - { - const typename array_type::const_iterator it_non_nine = std::find_if(data.begin(), data.end(), data_elem_is_non_nine_predicate); - return (it_non_nine == data.end()); + return result_one_is_ok; } }