// Copyright 2023 Matt Borland // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt #ifndef BOOST_DECIMAL_DETAIL_MASKS_HPP #define BOOST_DECIMAL_DETAIL_MASKS_HPP #include #include #include #include #include #include "int128.hpp" #ifndef BOOST_DECIMAL_BUILD_MODULE #include #include #endif namespace boost { namespace decimal { namespace detail { // Values from IEEE 754-2019 table 3.6 namespace impl { template constexpr auto storage_width_v() noexcept -> int { return decimal_val_v < 64 ? 32 : decimal_val_v < 128 ? 64 : 128; } template constexpr auto precision_v() noexcept -> int { return decimal_val_v < 64 ? 7 : decimal_val_v < 128 ? 16 : 34; } template constexpr auto bias_v() noexcept -> int { return decimal_val_v < 64 ? 101 : decimal_val_v < 128 ? 398 : 6176; } template constexpr auto max_biased_exp_v() noexcept -> int { return decimal_val_v < 64 ? 191 : decimal_val_v < 128 ? 767 : 12287; } template constexpr auto emax_v() noexcept -> int { return decimal_val_v < 64 ? 96 : decimal_val_v < 128 ? 384 : 6144; } template constexpr auto emin_v() noexcept -> int { return decimal_val_v < 64 ? -95 : decimal_val_v < 128 ? -383 : -6143; } template constexpr auto combination_field_width_v() noexcept -> int { return decimal_val_v < 64 ? 11 : decimal_val_v < 128 ? 13 : 17; } template constexpr auto trailing_significand_field_width_v() noexcept -> int { return decimal_val_v < 64 ? 20 : decimal_val_v < 128 ? 50 : 110; } template < 128, bool> = true> constexpr auto max_significand_v() noexcept { return decimal_val_v < 64 ? 9'999'999 : 9'999'999'999'999'999; } template >= 128, bool> = true> constexpr auto max_significand_v() noexcept { // 34x 9s return BOOST_DECIMAL_DETAIL_INT128_UINT128_C(9999999999999999999999999999999999); } template constexpr auto max_string_length_v() noexcept -> int { return decimal_val_v < 64 ? 15 : decimal_val_v < 128 ? 25 : 41; } template constexpr auto is_fast_type_v() noexcept -> bool { // The fast types all assign 1 additional bit over the regular types return decimal_val_v % 2 == 1; } } // namespace impl template , bool> = true> BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_INLINE_CONSTEXPR_VARIABLE auto storage_width_v = impl::storage_width_v(); template , bool> = true> BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_INLINE_CONSTEXPR_VARIABLE auto precision_v = impl::precision_v(); template , bool> = true> BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_INLINE_CONSTEXPR_VARIABLE auto bias_v = impl::bias_v(); template , bool> = true> BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_INLINE_CONSTEXPR_VARIABLE auto max_biased_exp_v = impl::max_biased_exp_v(); template , bool> = true> BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_INLINE_CONSTEXPR_VARIABLE auto emax_v = impl::emax_v(); template , bool> = true> BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_INLINE_CONSTEXPR_VARIABLE auto emin_v = impl::emin_v(); template , bool> = true> BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_INLINE_CONSTEXPR_VARIABLE auto etiny_v = -impl::bias_v(); template , bool> = true> BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_INLINE_CONSTEXPR_VARIABLE auto combination_field_width_v = impl::combination_field_width_v(); template , bool> = true> BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_INLINE_CONSTEXPR_VARIABLE auto trailing_significand_field_width_v = impl::trailing_significand_field_width_v(); template , bool> = true> BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_INLINE_CONSTEXPR_VARIABLE auto max_significand_v = impl::max_significand_v(); // sign + decimal digits + '.' + 'e' + '+/-' + max digits of exponent + null term template , bool> = true> BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_INLINE_CONSTEXPR_VARIABLE auto max_string_length_v = impl::max_string_length_v(); BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_INLINE_CONSTEXPR_VARIABLE auto storage_width {storage_width_v}; BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_INLINE_CONSTEXPR_VARIABLE auto precision {precision_v}; BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_INLINE_CONSTEXPR_VARIABLE auto bias {bias_v}; BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_INLINE_CONSTEXPR_VARIABLE auto max_biased_exp {max_biased_exp_v}; BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_INLINE_CONSTEXPR_VARIABLE auto emax {emax_v}; BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_INLINE_CONSTEXPR_VARIABLE auto emin {emin_v}; BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_INLINE_CONSTEXPR_VARIABLE auto etiny {etiny_v}; BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_INLINE_CONSTEXPR_VARIABLE auto combination_field_width {combination_field_width_v}; BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_INLINE_CONSTEXPR_VARIABLE auto max_significand {max_significand_v}; BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_INLINE_CONSTEXPR_VARIABLE auto max_string_length {max_string_length_v}; } //namespace detail } //namespace decimal } //namespace boost #endif //BOOST_DECIMAL_DETAIL_MASKS_HPP