2019-07-31 Jonathan Wakely <jwakely@redhat.com>
+ P0631R4 Math Constants
+ * include/Makefile.am: Add new header.
+ * include/Makefile.in: Regenerate.
+ * include/precompiled/stdc++.h: Include new header.
+ * include/std/numbers: New header.
+ * include/std/version (__cpp_lib_math_constants): Define.
+ * testsuite/26_numerics/numbers/1.cc: New test.
+ * testsuite/26_numerics/numbers/2.cc: New test.
+ * testsuite/26_numerics/numbers/3.cc: New test.
+ * testsuite/26_numerics/numbers/nonfloat_neg.cc: New test.
+
* include/std/bit: Add Doxygen comments.
PR libstdc++/91308
${std_srcdir}/memory \
${std_srcdir}/memory_resource \
${std_srcdir}/mutex \
+ ${std_srcdir}/numbers \
${std_srcdir}/numeric \
${std_srcdir}/optional \
${std_srcdir}/ostream \
${std_srcdir}/memory \
${std_srcdir}/memory_resource \
${std_srcdir}/mutex \
+ ${std_srcdir}/numbers \
${std_srcdir}/numeric \
${std_srcdir}/optional \
${std_srcdir}/ostream \
#if __cplusplus > 201703L
#include <bit>
// #include <compare>
+// #include <concepts>
+#include <numbers>
+// #include <ranges>
// #include <span>
// #include <syncstream>
#include <version>
--- /dev/null
+// <numbers> -*- C++ -*-
+
+// 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.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file include/numbers
+ * This is a Standard C++ Library header.
+ */
+
+#ifndef _GLIBCXX_NUMBERS
+#define _GLIBCXX_NUMBERS 1
+
+#pragma GCC system_header
+
+#if __cplusplus > 201703L
+
+#include <type_traits>
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+/** @defgroup math_constants Mathematical constants
+ * @ingroup numerics
+ * @{
+ */
+
+/// Namespace for mathematical constants
+namespace numbers
+{
+#define __cpp_lib_math_constants 201907L
+
+ /// @cond undoc
+ template<typename _Tp>
+ using _Enable_if_floating = enable_if_t<is_floating_point_v<_Tp>, _Tp>;
+ /// @endcond
+
+ /// e
+ template<typename _Tp>
+ inline constexpr _Tp e_v
+ = _Enable_if_floating<_Tp>(2.718281828459045235360287471352662498L);
+
+ /// log_2 e
+ template<typename _Tp>
+ inline constexpr _Tp log2e_v
+ = _Enable_if_floating<_Tp>(1.442695040888963407359924681001892137L);
+
+ /// log_10 e
+ template<typename _Tp>
+ inline constexpr _Tp log10e_v
+ = _Enable_if_floating<_Tp>(0.434294481903251827651128918916605082L);
+
+ /// pi
+ template<typename _Tp>
+ inline constexpr _Tp pi_v
+ = _Enable_if_floating<_Tp>(3.141592653589793238462643383279502884L);
+
+ /// 1/pi
+ template<typename _Tp>
+ inline constexpr _Tp inv_pi_v
+ = _Enable_if_floating<_Tp>(0.318309886183790671537767526745028724L);
+
+ /// 1/sqrt(pi)
+ template<typename _Tp>
+ inline constexpr _Tp inv_sqrtpi_v
+ = _Enable_if_floating<_Tp>(0.564189583547756286948079451560772586L);
+
+ /// log_e 2
+ template<typename _Tp>
+ inline constexpr _Tp ln2_v
+ = _Enable_if_floating<_Tp>(0.693147180559945309417232121458176568L);
+
+ /// log_e 10
+ template<typename _Tp>
+ inline constexpr _Tp ln10_v
+ = _Enable_if_floating<_Tp>(2.302585092994045684017991454684364208L);
+
+ /// sqrt(2)
+ template<typename _Tp>
+ inline constexpr _Tp sqrt2_v
+ = _Enable_if_floating<_Tp>(1.414213562373095048801688724209698079L);
+
+ /// sqrt(3)
+ template<typename _Tp>
+ inline constexpr _Tp sqrt3_v
+ = _Enable_if_floating<_Tp>(1.732050807568877293527446341505872367L);
+
+ /// 1/sqrt(3)
+ template<typename _Tp>
+ inline constexpr _Tp inv_sqrt3_v
+ = _Enable_if_floating<_Tp>(0.577350269189625764509148780501957456L);
+
+ /// The Euler-Mascheroni constant
+ template<typename _Tp>
+ inline constexpr _Tp egamma_v
+ = _Enable_if_floating<_Tp>(0.577215664901532860606512090082402431L);
+
+ /// The golden ratio, (1+sqrt(5))/2
+ template<typename _Tp>
+ inline constexpr _Tp phi_v
+ = _Enable_if_floating<_Tp>(1.618033988749894848204586834365638118L);
+
+ inline constexpr double e = e_v<double>;
+ inline constexpr double log2e = log2e_v<double>;
+ inline constexpr double log10e = log10e_v<double>;
+ inline constexpr double pi = pi_v<double>;
+ inline constexpr double inv_pi = inv_pi_v<double>;
+ inline constexpr double inv_sqrtpi = inv_sqrtpi_v<double>;
+ inline constexpr double ln2 = ln2_v<double>;
+ inline constexpr double ln10 = ln10_v<double>;
+ inline constexpr double sqrt2 = sqrt2_v<double>;
+ inline constexpr double sqrt3 = sqrt3_v<double>;
+ inline constexpr double inv_sqrt3 = inv_sqrt3_v<double>;
+ inline constexpr double egamma = egamma_v<double>;
+ inline constexpr double phi = phi_v<double>;
+
+} // namespace numbers
+/// @}
+_GLIBCXX_END_NAMESPACE_VERSION
+} // namespace std
+
+#endif // C++20
+#endif // _GLIBCXX_NUMBERS
# define __cpp_lib_is_constant_evaluated 201811L
#endif
#define __cpp_lib_list_remove_return_type 201806L
+#define __cpp_lib_math_constants 201907L
#endif // C++2a
#endif // C++17
#endif // C++14
--- /dev/null
+// 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>
+
+#ifndef __cpp_lib_math_constants
+# error "Feature-test macro for math constants missing in <numbers>"
+#elif __cpp_lib_math_constants != 201907L
+# error "Feature-test macro for math constants has wrong value in <numbers>"
+#endif
+
+void
+test01()
+{
+ const double* d1 = &std::numbers::e_v<double>;
+ const double* d2 = &std::numbers::log2e_v<double>;
+ const double* d3 = &std::numbers::log10e_v<double>;
+ const double* d4 = &std::numbers::pi_v<double>;
+ const double* d5 = &std::numbers::inv_pi_v<double>;
+ const double* d6 = &std::numbers::inv_sqrtpi_v<double>;
+ const double* d7 = &std::numbers::ln2_v<double>;
+ const double* d8 = &std::numbers::ln10_v<double>;
+ const double* d9 = &std::numbers::sqrt2_v<double>;
+ const double* d10 = &std::numbers::sqrt3_v<double>;
+ const double* d11 = &std::numbers::inv_sqrt3_v<double>;
+ const double* d12 = &std::numbers::egamma_v<double>;
+ const double* d13 = &std::numbers::phi_v<double>;
+}
+
+void
+test02()
+{
+ const float* d1 = &std::numbers::e_v<float>;
+ const float* d2 = &std::numbers::log2e_v<float>;
+ const float* d3 = &std::numbers::log10e_v<float>;
+ const float* d4 = &std::numbers::pi_v<float>;
+ const float* d5 = &std::numbers::inv_pi_v<float>;
+ const float* d6 = &std::numbers::inv_sqrtpi_v<float>;
+ const float* d7 = &std::numbers::ln2_v<float>;
+ const float* d8 = &std::numbers::ln10_v<float>;
+ const float* d9 = &std::numbers::sqrt2_v<float>;
+ const float* d10 = &std::numbers::sqrt3_v<float>;
+ const float* d11 = &std::numbers::inv_sqrt3_v<float>;
+ const float* d12 = &std::numbers::egamma_v<float>;
+ const float* d13 = &std::numbers::phi_v<float>;
+}
+
+void
+test03()
+{
+ const long double* d1 = &std::numbers::e_v<long double>;
+ const long double* d2 = &std::numbers::log2e_v<long double>;
+ const long double* d3 = &std::numbers::log10e_v<long double>;
+ const long double* d4 = &std::numbers::pi_v<long double>;
+ const long double* d5 = &std::numbers::inv_pi_v<long double>;
+ const long double* d6 = &std::numbers::inv_sqrtpi_v<long double>;
+ const long double* d7 = &std::numbers::ln2_v<long double>;
+ const long double* d8 = &std::numbers::ln10_v<long double>;
+ const long double* d9 = &std::numbers::sqrt2_v<long double>;
+ const long double* d10 = &std::numbers::sqrt3_v<long double>;
+ const long double* d11 = &std::numbers::inv_sqrt3_v<long double>;
+ const long double* d12 = &std::numbers::egamma_v<long double>;
+ const long double* d13 = &std::numbers::phi_v<long double>;
+}
+
+void
+test04()
+{
+ static_assert(std::numbers::e == std::numbers::e_v<double>);
+ static_assert(std::numbers::log2e == std::numbers::log2e_v<double>);
+ static_assert(std::numbers::log10e == std::numbers::log10e_v<double>);
+ static_assert(std::numbers::pi == std::numbers::pi_v<double>);
+ static_assert(std::numbers::inv_pi == std::numbers::inv_pi_v<double>);
+ static_assert(std::numbers::inv_sqrtpi == std::numbers::inv_sqrtpi_v<double>);
+ static_assert(std::numbers::ln2 == std::numbers::ln2_v<double>);
+ static_assert(std::numbers::ln10 == std::numbers::ln10_v<double>);
+ static_assert(std::numbers::sqrt2 == std::numbers::sqrt2_v<double>);
+ static_assert(std::numbers::sqrt3 == std::numbers::sqrt3_v<double>);
+ static_assert(std::numbers::inv_sqrt3 == std::numbers::inv_sqrt3_v<double>);
+ static_assert(std::numbers::egamma == std::numbers::egamma_v<double>);
+ static_assert(std::numbers::phi == std::numbers::phi_v<double>);
+}
--- /dev/null
+// 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 <version>
+
+#ifndef __cpp_lib_math_constants
+# error "Feature-test macro for math constants missing in <version>"
+#elif __cpp_lib_math_constants != 201907L
+# error "Feature-test macro for math constants has wrong value in <version>"
+#endif
--- /dev/null
+// 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>
+
+struct D { double val; };
+template<> inline constexpr D std::numbers::pi_v<D> = D{std::numbers::pi};
+static_assert( std::numbers::pi_v<D>.val == std::numbers::pi );
--- /dev/null
+// 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>
+
+int
+test01()
+{
+ return std::numbers::pi_v<int>; // { dg-error "here" }
+}
+
+void
+test02()
+{
+ struct S { };
+ auto s = std::numbers::egamma_v<S>; // { dg-error "here" }
+}
+
+// { dg-prune-output "no type named 'type' in" }