On 31/07/19 17:57 -0500, Segher Boessenkool wrote:
On Wed, Jul 31, 2019 at 08:43:50PM +0200, Marc Glisse wrote:
On Wed, 31 Jul 2019, Jonathan Wakely wrote:

>So something like the attached patch.  The glibc <math.h> says the
>values I used have enough digits for IEEE quad-precision:
>
>/* The above constants are not adequate for computation using `long
>double's.
> Therefore we provide as an extension constants with similar names as a
> GNU extension.  Provide enough digits for the 128-bit IEEE quad.  */
>
>I don't know if we need more accuracy for IBM double double.

double double has less precision than quad so it should be fine.

The *precision* (as defined in IEEE 754) of double double is much higher
than that of IEEE quad precision float: "the maximum number of
significant digits that can be represented in a format" -- it's just
that most of those bits have to be zero!

Neither double-double is a subset of QP, nor the other way around.  This
is *the* problem we have in rs6000 with these two float formats: GCC
cannot handle if two FP formats are like that.

(The math constants here are fine for double double, of course).

Thanks. I've committed the attached patch then, after testing on
x86_64-linux and powerpc64le-linux.


commit 8c16cb54739973f84f27055c32c7e0cc557a784e
Author: redi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>
Date:   Tue Aug 6 15:57:51 2019 +0000

    Specialize std::numbers constants for __float128
    
            * include/std/numbers [!__STRICT_ANSI__ && _GLIBCXX_USE_FLOAT128]
            (e_v, log2e_v, log10e_v, pi_v, inv_pi_v, inv_sqrtpi_v, ln2_v, ln10_v)
            (sqrt2_v, sqrt3_v, inv_sqrt3, egamma_v, phi_v): Add explicit
            specializations for __float128.
            * testsuite/26_numerics/numbers/float128.cc: New test.
    
    git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@274145 138bc75d-0d04-0410-961f-82ee72b054a4

diff --git a/libstdc++-v3/include/std/numbers b/libstdc++-v3/include/std/numbers
index b8e38dd8080..314b130fbd5 100644
--- a/libstdc++-v3/include/std/numbers
+++ b/libstdc++-v3/include/std/numbers
@@ -133,6 +133,72 @@ namespace numbers
   inline constexpr double egamma = egamma_v<double>;
   inline constexpr double phi = phi_v<double>;
 
+#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
+  template<>
+    inline constexpr __float128 e_v<__float128>
+      = 2.718281828459045235360287471352662498Q;
+
+  /// log_2 e
+  template<>
+    inline constexpr __float128 log2e_v<__float128>
+      = 1.442695040888963407359924681001892137Q;
+
+  /// log_10 e
+  template<>
+    inline constexpr __float128 log10e_v<__float128>
+      = 0.434294481903251827651128918916605082Q;
+
+  /// pi
+  template<>
+    inline constexpr __float128 pi_v<__float128>
+      = 3.141592653589793238462643383279502884Q;
+
+  /// 1/pi
+  template<>
+    inline constexpr __float128 inv_pi_v<__float128>
+      = 0.318309886183790671537767526745028724Q;
+
+  /// 1/sqrt(pi)
+  template<>
+    inline constexpr __float128 inv_sqrtpi_v<__float128>
+      = 0.564189583547756286948079451560772586Q;
+
+  /// log_e 2
+  template<>
+    inline constexpr __float128 ln2_v<__float128>
+      = 0.693147180559945309417232121458176568Q;
+
+  /// log_e 10
+  template<>
+    inline constexpr __float128 ln10_v<__float128>
+      = 2.302585092994045684017991454684364208Q;
+
+  /// sqrt(2)
+  template<>
+    inline constexpr __float128 sqrt2_v<__float128>
+      = 1.414213562373095048801688724209698079Q;
+
+  /// sqrt(3)
+  template<>
+    inline constexpr __float128 sqrt3_v<__float128>
+      = 1.732050807568877293527446341505872367Q;
+
+  /// 1/sqrt(3)
+  template<>
+    inline constexpr __float128 inv_sqrt3_v<__float128>
+      = 0.577350269189625764509148780501957456Q;
+
+  /// The Euler-Mascheroni constant
+  template<>
+    inline constexpr __float128 egamma_v<__float128>
+      = 0.577215664901532860606512090082402431Q;
+
+  /// The golden ratio, (1+sqrt(5))/2
+  template<>
+    inline constexpr __float128 phi_v<__float128>
+      = 1.618033988749894848204586834365638118Q;
+#endif // USE_FLOAT128
+
 } // namespace numbers
 /// @}
 _GLIBCXX_END_NAMESPACE_VERSION
diff --git a/libstdc++-v3/testsuite/26_numerics/numbers/float128.cc b/libstdc++-v3/testsuite/26_numerics/numbers/float128.cc
new file mode 100644
index 00000000000..2d9dafcd482
--- /dev/null
+++ b/libstdc++-v3/testsuite/26_numerics/numbers/float128.cc
@@ -0,0 +1,41 @@
+// Copyright (C) 2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <numbers>
+
+#if defined(_GLIBCXX_USE_FLOAT128)
+void
+test01()
+{
+  const __float128* d1  = &std::numbers::e_v<__float128>;
+  const __float128* d2  = &std::numbers::log2e_v<__float128>;
+  const __float128* d3  = &std::numbers::log10e_v<__float128>;
+  const __float128* d4  = &std::numbers::pi_v<__float128>;
+  const __float128* d5  = &std::numbers::inv_pi_v<__float128>;
+  const __float128* d6  = &std::numbers::inv_sqrtpi_v<__float128>;
+  const __float128* d7  = &std::numbers::ln2_v<__float128>;
+  const __float128* d8  = &std::numbers::ln10_v<__float128>;
+  const __float128* d9  = &std::numbers::sqrt2_v<__float128>;
+  const __float128* d10 = &std::numbers::sqrt3_v<__float128>;
+  const __float128* d11 = &std::numbers::inv_sqrt3_v<__float128>;
+  const __float128* d12 = &std::numbers::egamma_v<__float128>;
+  const __float128* d13 = &std::numbers::phi_v<__float128>;
+}
+#endif

Reply via email to