Greetings,
I know people are mostly looking at release branch work but I'd like to
post this. Other projects like mppp and boost use our __float128 with
C++. I use it for specfun testing and various other projects. I'd like
to offer a series of patches to enable this support straight from
libstdc++. This is the first patch. Next will be and then
a bit later.
It's pretty straightforward but others might have tips on configuration
(and anything else ;-)). Built and tested of x86_64-linux.
Ok?
Ed
2019-05-11 Ed Smith-Rowland <3dw...@verizon.net>
Implement numeric_limits<__float128>.
* include/std/limits: Copy limit macros from quadmath.h;
(__glibcxx_float128_has_denorm_loss, __glibcxx_float128_traps,
__glibcxx_float128_tinyness_before): New macros (set to false);
(numeric_limits<__float128>): New specialization.
* : Add __float128 test guarded by _GLIBCXX_USE_FLOAT128.
* : testsuite/18_support/numeric_limits/denorm_min.cc: Add __float128
test guarded by _GLIBCXX_USE_FLOAT128.
* : testsuite/18_support/numeric_limits/dr559.cc: Same.
* : testsuite/18_support/numeric_limits/epsilon.cc: Same.
* : testsuite/18_support/numeric_limits/infinity.cc: Same.
* : testsuite/18_support/numeric_limits/is_iec559.cc: Same.
* : testsuite/18_support/numeric_limits/lowest.cc: Same.
* : testsuite/18_support/numeric_limits/max_digits10.cc: Same.
* : testsuite/18_support/numeric_limits/min_max.cc: Same.
* : testsuite/18_support/numeric_limits/quiet_NaN.cc: Same.
Index: include/std/limits
===
--- include/std/limits (revision 271076)
+++ include/std/limits (working copy)
@@ -41,6 +41,19 @@
#include
+#if defined(_GLIBCXX_USE_FLOAT128) && !defined(__STRICT_ANSI__)
+# define FLT128_MAX 1.18973149535723176508575932662800702e4932Q
+# define FLT128_MIN 3.36210314311209350626267781732175260e-4932Q
+# define FLT128_EPSILON 1.92592994438723585305597794258492732e-34Q
+# define FLT128_DENORM_MIN 6.475175119438025110924438958227646552e-4966Q
+# define FLT128_MANT_DIG 113
+# define FLT128_MIN_EXP (-16381)
+# define FLT128_MAX_EXP 16384
+# define FLT128_DIG 33
+# define FLT128_MIN_10_EXP (-4931)
+# define FLT128_MAX_10_EXP 4932
+#endif
+
//
// The numeric_limits<> traits document implementation-defined aspects
// of fundamental arithmetic data types (integers and floating points).
@@ -123,6 +136,24 @@
# define __glibcxx_long_double_tinyness_before false
#endif
+#if defined(_GLIBCXX_USE_FLOAT128) && !defined(__STRICT_ANSI__)
+
+// __float128
+
+// Default values. Should be overridden in configuration files if necessary.
+
+# ifndef __glibcxx_float128_has_denorm_loss
+#define __glibcxx_float128_has_denorm_loss false
+# endif
+# ifndef __glibcxx_float128_traps
+#define __glibcxx_float128_traps false
+# endif
+# ifndef __glibcxx_float128_tinyness_before
+#define __glibcxx_float128_tinyness_before false
+# endif
+
+# endif // _GLIBCXX_USE_FLOAT128
+
// You should not need to define any macros below this point.
#define __glibcxx_signed_b(T,B)((T)(-1) < 0)
@@ -1880,6 +1911,85 @@
#undef __glibcxx_long_double_traps
#undef __glibcxx_long_double_tinyness_before
+#if defined(_GLIBCXX_USE_FLOAT128) && !defined(__STRICT_ANSI__)
+
+ /// numeric_limits<__float128> specialization.
+ template<>
+struct numeric_limits<__float128>
+{
+ static _GLIBCXX_USE_CONSTEXPR bool is_specialized = true;
+
+ static _GLIBCXX_CONSTEXPR __float128
+ min() _GLIBCXX_USE_NOEXCEPT { return FLT128_MIN; }
+
+ static _GLIBCXX_CONSTEXPR __float128
+ max() _GLIBCXX_USE_NOEXCEPT { return FLT128_MAX; }
+
+#if __cplusplus >= 201103L
+ static _GLIBCXX_CONSTEXPR __float128
+ lowest() _GLIBCXX_USE_NOEXCEPT { return -FLT128_MAX; }
+#endif
+
+ static _GLIBCXX_USE_CONSTEXPR int digits = FLT128_MANT_DIG;
+ static _GLIBCXX_USE_CONSTEXPR int digits10 = FLT128_DIG;
+#if __cplusplus >= 201103L
+ static _GLIBCXX_USE_CONSTEXPR int max_digits10
+= __glibcxx_max_digits10 (FLT128_MANT_DIG);
+#endif
+ 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 FLT128_EPSILON; }
+
+ static _GLIBCXX_CONSTEXPR __float128
+ round_error() _GLIBCXX_USE_NOEXCEPT { return 0.5Q; }
+
+ static _GLIBCXX_USE_CONSTEXPR int min_exponent = FLT128_MIN_EXP;
+ static _GLIBCXX_USE_CONSTEXPR int min_exponent10 = FLT128_MIN_10_EXP;
+ static _GLIBCXX_USE_CONSTEXPR int max_exponent = FLT128_MAX_EXP;
+ static _GL