diff --git a/dumux/common/quad.hh b/dumux/common/quad.hh index 62230d173f5d9c490c8374ad504a194174c0b808..e23b6cb652d38f9c49710f6a95c4597e9b345e44 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));