29#if !defined OPM_COMMON_QUAD_HPP && HAVE_QUAD
30#define OPM_COMMON_QUAD_HPP
44typedef __float128 quad;
51class numeric_limits<quad>
54 static constexpr bool is_specialized =
true;
56 static constexpr quad min() throw()
57 {
return FLT128_MIN; }
58 static constexpr quad max() throw()
59 {
return FLT128_MAX; }
62 static constexpr int digits = FLT128_MANT_DIG;
64 static constexpr int digits10 = FLT128_DIG;
65 static constexpr bool is_signed =
true;
66 static constexpr bool is_integer =
false;
67 static constexpr bool is_exact =
false;
68 static constexpr int radix = 0;
69 static constexpr quad epsilon() throw()
70 {
return FLT128_EPSILON; }
71 static constexpr quad round_error() throw()
74 static constexpr int min_exponent = FLT128_MIN_EXP;
75 static constexpr int min_exponent10 = FLT128_MIN_10_EXP;
76 static constexpr int max_exponent = FLT128_MAX_EXP;
77 static constexpr int max_exponent10 = FLT128_MAX_10_EXP;
79 static constexpr bool has_infinity =
true;
80 static constexpr bool has_quiet_NaN =
true;
81 static constexpr bool has_signaling_NaN =
true;
82 static constexpr float_denorm_style has_denorm = denorm_present;
83 static constexpr bool has_denorm_loss =
false;
84 static constexpr quad infinity() throw()
85 {
return __builtin_huge_valq(); }
86 static constexpr quad quiet_NaN() throw()
87 {
return __builtin_nan(
""); }
88 static constexpr quad signaling_NaN() throw()
89 {
return __builtin_nans(
""); }
90 static constexpr quad denorm_min() throw()
91 {
return FLT128_DENORM_MIN; }
93 static constexpr bool is_iec559 =
true;
94 static constexpr bool is_bounded =
true;
95 static constexpr bool is_modulo =
false;
97 static constexpr bool traps = std::numeric_limits<double>::traps;
98 static constexpr bool tinyness_before = std::numeric_limits<double>::tinyness_before;
99 static constexpr float_round_style round_style = round_to_nearest;
105struct is_floating_point<quad>
106 :
public integral_constant<bool, true>
110struct is_arithmetic<quad>
111 :
public integral_constant<bool, true>
115struct is_fundamental<quad>
116 :
public integral_constant<bool, true>
120struct is_scalar<quad>
121 :
public integral_constant<bool, true>
124#if __cplusplus < 202002L
127 :
public integral_constant<bool, true>
132struct is_signed<quad>
133 :
public integral_constant<bool, true>
138struct is_standard_layout<quad>
139 :
public integral_constant<bool, true>
143struct is_trivial<quad>
144 :
public integral_constant<bool, true>
154template <
class OtherType>
155struct is_assignable<quad, OtherType>
156 :
public integral_constant<bool, is_arithmetic<OtherType>::value>
159template <
class OtherType>
160struct is_nothrow_assignable<quad, OtherType>
161 :
public is_assignable<quad, OtherType>
172struct is_copy_assignable<quad>
173 :
public integral_constant<bool, true>
177struct is_nothrow_copy_assignable<quad>
178 :
public integral_constant<bool, true>
182struct is_move_assignable<quad>
183 :
public integral_constant<bool, true>
187struct is_nothrow_move_assignable<quad>
188 :
public integral_constant<bool, true>
192struct is_constructible<quad>
193 :
public integral_constant<bool, true>
197struct is_nothrow_constructible<quad>
198 :
public integral_constant<bool, true>
202struct is_default_constructible<quad>
203 :
public integral_constant<bool, true>
207struct is_nothrow_default_constructible<quad>
208 :
public integral_constant<bool, true>
219struct is_copy_constructible<quad>
220 :
public integral_constant<bool, true>
224struct is_move_constructible<quad>
225 :
public integral_constant<bool, true>
229struct is_nothrow_move_constructible<quad>
230 :
public integral_constant<bool, true>
235struct is_destructible<quad>
236 :
public integral_constant<bool, true>
240struct is_nothrow_destructible<quad>
241 :
public integral_constant<bool, true>
244template <
class OtherType>
245struct is_convertible<quad, OtherType>
246 :
public is_arithmetic<OtherType>
249inline std::ostream& operator<<(std::ostream& os,
const quad& val)
251 if (os.precision() > std::numeric_limits<double>::digits10)
252 throw std::runtime_error(
"The precision requested for output cannot "
253 "be represented by a double precision floating "
256 return os << static_cast<double>(val);
259inline std::istream& operator>>(std::istream& is, quad& val)
262 std::istream& ret = (is >> tmp);
267inline quad real(quad val)
270inline quad real(
const std::complex<quad>& val)
271{
return val.real(); }
273inline quad imag(quad)
276inline quad imag(
const std::complex<quad>& val)
277{
return val.imag(); }
279inline quad abs(quad val)
280{
return (val < 0) ? -val : val; }
282inline quad floor(quad val)
283{
return floorq(val); }
285inline quad ceil(quad val)
286{
return ceilq(val); }
288inline quad max(quad a, quad b)
289{
return (a > b) ? a : b; }
291inline quad min(quad a, quad b)
292{
return (a < b) ? a : b; }
294inline quad sqrt(quad val)
295{
return sqrtq(val); }
297template <
class ExpType>
298inline quad pow(quad base, ExpType exp)
299{
return powq(base,
static_cast<quad
>(exp)); }
301template <
class BaseType>
302inline quad pow(BaseType base, quad exp)
303{
return powq(
static_cast<quad
>(base), exp); }
305inline quad pow(quad base, quad exp)
306{
return powq(base, exp); }
308inline quad exp(quad val)
311inline quad log(quad val)
314inline quad sin(quad val)
317inline quad cos(quad val)
320inline quad tan(quad val)
323inline quad atan(quad val)
324{
return atanq(val); }
326inline quad atan2(quad a, quad b)
327{
return atan2q(a, b); }
329inline quad round(quad val)
330{
return roundq(val); }
332inline bool isfinite(quad val)
333{
return finiteq(val); }
335inline bool isnan(quad val)
336{
return isnanq(val); }
338inline bool isinf(quad val)
339{
return isinfq(val); }
347#include <dune/common/classname.hh>
351inline std::string className<__float128>()
358#include <dune/fem/io/streams/streams_inline.hh>
362template <
class Traits>
363inline OutStreamInterface<Traits>&
364operator<<(OutStreamInterface<Traits>& out, quad value)
366 out.writeDouble(
static_cast<double>(value));
370template <
class Traits>
371inline InStreamInterface<Traits>&
372operator>>(InStreamInterface<Traits>& in, quad& value)