From 703ed910fbf5f3212a3782a89a74908d7360666b Mon Sep 17 00:00:00 2001
From: Andreas Lauser <and@poware.org>
Date: Mon, 29 Aug 2011 13:02:39 +0000
Subject: [PATCH] quad precision: add specialization of the numeric_limits

git-svn-id: svn://svn.iws.uni-stuttgart.de/DUMUX/dumux/trunk@6549 2fb0f335-1f38-0410-981e-8018bf24f1b0
---
 dumux/common/quad.hh | 54 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)

diff --git a/dumux/common/quad.hh b/dumux/common/quad.hh
index 62230d173f..e23b6cb652 100644
--- a/dumux/common/quad.hh
+++ b/dumux/common/quad.hh
@@ -30,6 +30,7 @@
 
 #include <iostream>
 #include <cmath>
+#include <limits>
 
 extern "C" {
 #include <quadmath.h>
@@ -40,6 +41,59 @@ typedef __float128 quad;
 namespace std
 {
 
+// provide the numeric limits for the quad precision type
+template <>
+class numeric_limits<quad>
+{
+public:
+    static constexpr bool is_specialized = true;
+
+    static constexpr quad min() throw() 
+    { return FLT128_MIN; }
+    static constexpr quad max() throw()
+    { return FLT128_MAX; }
+        
+    // number of bits in mantissa
+    static constexpr int  digits = FLT128_MANT_DIG;
+    // number of decimal digits
+    static constexpr int  digits10 = FLT128_DIG;
+    static constexpr bool is_signed = true;
+    static constexpr bool is_integer = false;
+    static constexpr bool is_exact = false;
+    static constexpr int radix = 0;
+    static constexpr quad epsilon() throw()
+    { return FLT128_EPSILON; }
+    static constexpr quad round_error() throw()
+    { return 0.5; }
+    
+    static constexpr int min_exponent = FLT128_MIN_EXP;
+    static constexpr int min_exponent10 = FLT128_MIN_10_EXP;
+    static constexpr int max_exponent = FLT128_MAX_EXP;
+    static constexpr int max_exponent10 = FLT128_MAX_10_EXP;
+    
+    static constexpr bool has_infinity = true;
+    static constexpr bool has_quiet_NaN = true;
+    static constexpr bool has_signaling_NaN = true;
+    static constexpr float_denorm_style has_denorm = denorm_present;
+    static constexpr bool has_denorm_loss = false;
+    static constexpr quad infinity() throw()
+    { return __builtin_huge_valq(); };
+    static constexpr quad quiet_NaN() throw()
+    { return __builtin_nan(""); }
+    static constexpr quad signaling_NaN() throw()
+    { return __builtin_nans(""); }
+    static constexpr quad denorm_min() throw()
+    { return FLT128_DENORM_MIN; }
+    
+    static constexpr bool is_iec559 = true;
+    static constexpr bool is_bounded = true;
+    static constexpr bool is_modulo = false;
+    
+    static constexpr bool traps = std::numeric_limits<double>::traps;
+    static constexpr bool tinyness_before = std::numeric_limits<double>::tinyness_before;
+    static constexpr float_round_style round_style = round_to_nearest;
+};
+
 inline std::ostream& operator<<(std::ostream& os, const quad &val)
 {
     return (os << double(val));
-- 
GitLab