29#if !defined OPM_COMMON_QUAD_HPP && HAVE_QUAD
30#define OPM_COMMON_QUAD_HPP
45typedef __float128 quad;
52class numeric_limits<quad>
55 static constexpr bool is_specialized =
true;
57 static constexpr quad min() throw()
58 {
return FLT128_MIN; }
59 static constexpr quad max() throw()
60 {
return FLT128_MAX; }
63 static constexpr int digits = FLT128_MANT_DIG;
65 static constexpr int digits10 = FLT128_DIG;
66 static constexpr bool is_signed =
true;
67 static constexpr bool is_integer =
false;
68 static constexpr bool is_exact =
false;
69 static constexpr int radix = 0;
70 static constexpr quad epsilon() throw()
71 {
return FLT128_EPSILON; }
72 static constexpr quad round_error() throw()
75 static constexpr int min_exponent = FLT128_MIN_EXP;
76 static constexpr int min_exponent10 = FLT128_MIN_10_EXP;
77 static constexpr int max_exponent = FLT128_MAX_EXP;
78 static constexpr int max_exponent10 = FLT128_MAX_10_EXP;
80 static constexpr bool has_infinity =
true;
81 static constexpr bool has_quiet_NaN =
true;
82 static constexpr bool has_signaling_NaN =
true;
83 static constexpr float_denorm_style has_denorm = denorm_present;
84 static constexpr bool has_denorm_loss =
false;
85 static constexpr quad infinity() throw()
86 {
return __builtin_huge_valq(); }
87 static constexpr quad quiet_NaN() throw()
88 {
return __builtin_nan(
""); }
89 static constexpr quad signaling_NaN() throw()
90 {
return __builtin_nans(
""); }
91 static constexpr quad denorm_min() throw()
92 {
return FLT128_DENORM_MIN; }
94 static constexpr bool is_iec559 =
true;
95 static constexpr bool is_bounded =
true;
96 static constexpr bool is_modulo =
false;
98 static constexpr bool traps = std::numeric_limits<double>::traps;
99 static constexpr bool tinyness_before = std::numeric_limits<double>::tinyness_before;
100 static constexpr float_round_style round_style = round_to_nearest;
106struct is_floating_point<quad>
107 :
public integral_constant<bool, true>
111struct is_arithmetic<quad>
112 :
public integral_constant<bool, true>
116struct is_fundamental<quad>
117 :
public integral_constant<bool, true>
121struct is_scalar<quad>
122 :
public integral_constant<bool, true>
125#if __cplusplus < 202002L
128 :
public integral_constant<bool, true>
133struct is_signed<quad>
134 :
public integral_constant<bool, true>
139struct is_standard_layout<quad>
140 :
public integral_constant<bool, true>
144struct is_trivial<quad>
145 :
public integral_constant<bool, true>
155template <
class OtherType>
156struct is_assignable<quad, OtherType>
157 :
public integral_constant<bool, is_arithmetic<OtherType>::value>
160template <
class OtherType>
161struct is_nothrow_assignable<quad, OtherType>
162 :
public is_assignable<quad, OtherType>
173struct is_copy_assignable<quad>
174 :
public integral_constant<bool, true>
178struct is_nothrow_copy_assignable<quad>
179 :
public integral_constant<bool, true>
183struct is_move_assignable<quad>
184 :
public integral_constant<bool, true>
188struct is_nothrow_move_assignable<quad>
189 :
public integral_constant<bool, true>
193struct is_constructible<quad>
194 :
public integral_constant<bool, true>
198struct is_nothrow_constructible<quad>
199 :
public integral_constant<bool, true>
203struct is_default_constructible<quad>
204 :
public integral_constant<bool, true>
208struct is_nothrow_default_constructible<quad>
209 :
public integral_constant<bool, true>
220struct is_copy_constructible<quad>
221 :
public integral_constant<bool, true>
225struct is_move_constructible<quad>
226 :
public integral_constant<bool, true>
230struct is_nothrow_move_constructible<quad>
231 :
public integral_constant<bool, true>
236struct is_destructible<quad>
237 :
public integral_constant<bool, true>
241struct is_nothrow_destructible<quad>
242 :
public integral_constant<bool, true>
245template <
class OtherType>
246struct is_convertible<quad, OtherType>
247 :
public is_arithmetic<OtherType>
250#if !QUADMATH_HAS_IO_OPERATOR
251inline std::ostream& operator<<(std::ostream& os,
const quad& val)
253 if (os.precision() > std::numeric_limits<double>::digits10)
254 throw std::runtime_error(
"The precision requested for output cannot "
255 "be represented by a double precision floating "
258 return os << static_cast<double>(val);
261inline typename std::istream& operator>>(std::istream& is, quad& val)
264 std::istream& ret = (is >> tmp);
270#if !QUADMATH_HAS_MATH_OPERATORS
271inline quad real(quad val)
274inline quad real(
const std::complex<quad>& val)
275{
return val.real(); }
277inline quad imag(quad)
280inline quad imag(
const std::complex<quad>& val)
281{
return val.imag(); }
283inline quad abs(quad val)
284{
return (val < 0) ? -val : val; }
286inline quad floor(quad val)
287{
return floorq(val); }
289inline quad ceil(quad val)
290{
return ceilq(val); }
293inline quad max(quad a, quad b)
294{
return (a > b) ? a : b; }
296inline quad min(quad a, quad b)
297{
return (a < b) ? a : b; }
300inline quad sqrt(quad val)
301{
return sqrtq(val); }
304template <
class ExpType>
305inline quad pow(quad base, ExpType exp)
306{
return powq(base,
static_cast<quad
>(exp)); }
308template <
class BaseType>
309inline quad pow(BaseType base, quad exp)
310{
return powq(
static_cast<quad
>(base), exp); }
312#if !QUADMATH_HAS_MATH_OPERATORS
313inline quad pow(quad base, quad exp)
314{
return powq(base, exp); }
316inline quad exp(quad val)
319inline quad log(quad val)
322inline quad sin(quad val)
325inline quad cos(quad val)
328inline quad tan(quad val)
331inline quad atan(quad val)
332{
return atanq(val); }
334inline quad atan2(quad a, quad b)
335{
return atan2q(a, b); }
337inline quad round(quad val)
338{
return roundq(val); }
340inline bool isfinite(quad val)
341{
return finiteq(val); }
343inline bool isnan(quad val)
344{
return isnanq(val); }
346inline bool isinf(quad val)
347{
return isinfq(val); }
352namespace std::numbers {
354 inline constexpr quad pi_v<quad> = M_PIq;
361#include <dune/common/classname.hh>
365inline std::string className<__float128>()
372#include <dune/fem/io/streams/streams_inline.hh>
376template <
class Traits>
377inline OutStreamInterface<Traits>&
378operator<<(OutStreamInterface<Traits>& out, quad value)
380 out.writeDouble(
static_cast<double>(value));
384template <
class Traits>
385inline InStreamInterface<Traits>&
386operator>>(InStreamInterface<Traits>& in, quad& value)