From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2181) id 33B0B3858C1F; Wed, 31 May 2023 12:21:46 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 33B0B3858C1F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1685535706; bh=28EsQt9FLSg3bBHPfGeOXk67miMslavcOCQOwxM1rpw=; h=From:To:Subject:Date:From; b=SpRQw4bRM+oJlPA19EO2DZRxiyAqwCIBycTFKiPiGrKd3et6zgyFzpLrHqj+Agriq xrPphakdgj8ya7NhOLkfl8lP9acL2Sqa3XJEJnpn5Q4bURdKZr+7K5ggn1hG6BjOAF J/h31DlsRJzo3WmwBKpFQbtj2eebw2xzXKHtM+xE= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jonathan Wakely To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc r14-1433] libstdc++: Add std::numeric_limits<__float128> specialization [PR104772] X-Act-Checkin: gcc X-Git-Author: Jonathan Wakely X-Git-Refname: refs/heads/master X-Git-Oldrev: 51cf0b3949b88b5e622872e4dac019ceb27400e1 X-Git-Newrev: f150a084e25eaa98afaf25e2211001047ecc8d44 Message-Id: <20230531122146.33B0B3858C1F@sourceware.org> Date: Wed, 31 May 2023 12:21:46 +0000 (GMT) List-Id: https://gcc.gnu.org/g:f150a084e25eaa98afaf25e2211001047ecc8d44 commit r14-1433-gf150a084e25eaa98afaf25e2211001047ecc8d44 Author: Jonathan Wakely Date: Wed May 17 14:02:14 2023 +0100 libstdc++: Add std::numeric_limits<__float128> specialization [PR104772] As suggested by Jakub in the PR, this just hardcodes the constants with a Q suffix, since the properties of __float128 are not going to change. We can only define it for non-strict modes because the suffix gives an error otherwise, even in system headers: limits:2085: error: unable to find numeric literal operator 'operator""Q' libstdc++-v3/ChangeLog: PR libstdc++/104772 * include/std/limits (numeric_limits<__float128>): Define. * testsuite/18_support/numeric_limits/128bit.cc: New test. Diff: --- libstdc++-v3/include/std/limits | 75 ++++++++++++++++++++++ .../testsuite/18_support/numeric_limits/128bit.cc | 12 ++++ 2 files changed, 87 insertions(+) diff --git a/libstdc++-v3/include/std/limits b/libstdc++-v3/include/std/limits index 8bafd6fb972..5f341e63b93 100644 --- a/libstdc++-v3/include/std/limits +++ b/libstdc++-v3/include/std/limits @@ -2073,6 +2073,81 @@ __glibcxx_float_n(128) #endif +#if defined(_GLIBCXX_USE_FLOAT128) && !defined(__STRICT_ANSI__) + __extension__ + template<> + struct numeric_limits<__float128> + { + static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true; + + static _GLIBCXX_CONSTEXPR __float128 + min() _GLIBCXX_USE_NOEXCEPT + { return __extension__ 3.36210314311209350626267781732175260e-4932Q; } + + static _GLIBCXX_CONSTEXPR __float128 + max() _GLIBCXX_USE_NOEXCEPT + { return __extension__ 1.18973149535723176508575932662800702e+4932Q; } + + static _GLIBCXX_CONSTEXPR __float128 + lowest() _GLIBCXX_USE_NOEXCEPT + { return -max(); } + + static _GLIBCXX_USE_CONSTEXPR int digits = 113; + static _GLIBCXX_USE_CONSTEXPR int digits10 = 33; + static _GLIBCXX_USE_CONSTEXPR int max_digits10 + = __glibcxx_max_digits10 (112); + static _GLIBCXX_USE_CONSTEXPR bool is_signed = true; + static _GLIBCXX_USE_CONSTEXPR bool is_integer = false; + static _GLIBCXX_USE_CONSTEXPR bool is_exact = false; + static _GLIBCXX_USE_CONSTEXPR int radix = __FLT_RADIX__; + + static _GLIBCXX_CONSTEXPR __float128 + epsilon() _GLIBCXX_USE_NOEXCEPT + { return __extension__ 1.92592994438723585305597794258492732e-34Q; } + + static _GLIBCXX_CONSTEXPR __float128 + round_error() _GLIBCXX_USE_NOEXCEPT { return __extension__ 0.5Q; } + + static _GLIBCXX_USE_CONSTEXPR int min_exponent = -16381; + static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = -4931; + static _GLIBCXX_USE_CONSTEXPR int max_exponent = 16384; + static _GLIBCXX_USE_CONSTEXPR int max_exponent10 = 4932; + + static _GLIBCXX_USE_CONSTEXPR bool has_infinity = 1; + static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = 1; + static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = has_quiet_NaN; + static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm + = denorm_present; + static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false; + + static _GLIBCXX_CONSTEXPR __float128 + infinity() _GLIBCXX_USE_NOEXCEPT + { return __builtin_huge_valq(); } + + static _GLIBCXX_CONSTEXPR __float128 + quiet_NaN() _GLIBCXX_USE_NOEXCEPT + { return __builtin_nanq(""); } + + static _GLIBCXX_CONSTEXPR __float128 + signaling_NaN() _GLIBCXX_USE_NOEXCEPT + { return __builtin_nansq(""); } + + static _GLIBCXX_CONSTEXPR __float128 + denorm_min() _GLIBCXX_USE_NOEXCEPT + { return __extension__ 6.47517511943802511092443895822764655e-4966Q; } + + static _GLIBCXX_USE_CONSTEXPR bool is_iec559 + = has_infinity && has_quiet_NaN && has_denorm == denorm_present; + static _GLIBCXX_USE_CONSTEXPR bool is_bounded = true; + static _GLIBCXX_USE_CONSTEXPR bool is_modulo = false; + + static _GLIBCXX_USE_CONSTEXPR bool traps = false; + static _GLIBCXX_USE_CONSTEXPR bool tinyness_before = false; + static _GLIBCXX_USE_CONSTEXPR float_round_style round_style + = round_to_nearest; + }; +#endif // _GLIBCXX_USE_FLOAT128 && ! __STRICT_ANSI__ + _GLIBCXX_END_NAMESPACE_VERSION } // namespace diff --git a/libstdc++-v3/testsuite/18_support/numeric_limits/128bit.cc b/libstdc++-v3/testsuite/18_support/numeric_limits/128bit.cc new file mode 100644 index 00000000000..e8ea568df94 --- /dev/null +++ b/libstdc++-v3/testsuite/18_support/numeric_limits/128bit.cc @@ -0,0 +1,12 @@ +// { dg-do compile } + +#include + +#if __SIZEOF_FLOAT128__ && !defined __STRICT_ANSI__ +__extension__ template class std::numeric_limits<__float128>; +#endif + +#if __SIZEOF_INT128__ +__extension__ template class std::numeric_limits<__int128>; +__extension__ template class std::numeric_limits; +#endif