NumTraits.h
Go to the documentation of this file.
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com>
5 //
6 // This Source Code Form is subject to the terms of the Mozilla
7 // Public License v. 2.0. If a copy of the MPL was not distributed
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 
10 #ifndef EIGEN_NUMTRAITS_H
11 #define EIGEN_NUMTRAITS_H
12 
13 // IWYU pragma: private
14 #include "./InternalHeaderCheck.h"
15 
16 namespace Eigen {
17 
18 namespace internal {
19 
20 // default implementation of digits(), based on numeric_limits if specialized,
21 // 0 for integer types, and log2(epsilon()) otherwise.
22 template <typename T, bool use_numeric_limits = std::numeric_limits<T>::is_specialized,
25  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static int run() { return std::numeric_limits<T>::digits; }
26 };
27 
28 template <typename T>
29 struct default_digits_impl<T, false, false> // Floating point
30 {
32  using std::ceil;
33  using std::log2;
34  typedef typename NumTraits<T>::Real Real;
36  }
37 };
38 
39 template <typename T>
40 struct default_digits_impl<T, false, true> // Integer
41 {
42  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static int run() { return 0; }
43 };
44 
45 // default implementation of digits10(), based on numeric_limits if specialized,
46 // 0 for integer types, and floor((digits()-1)*log10(2)) otherwise.
47 template <typename T, bool use_numeric_limits = std::numeric_limits<T>::is_specialized,
50  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static int run() { return std::numeric_limits<T>::digits10; }
51 };
52 
53 template <typename T>
54 struct default_digits10_impl<T, false, false> // Floating point
55 {
57  using std::floor;
58  using std::log10;
59  typedef typename NumTraits<T>::Real Real;
61  }
62 };
63 
64 template <typename T>
65 struct default_digits10_impl<T, false, true> // Integer
66 {
67  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static int run() { return 0; }
68 };
69 
70 // default implementation of max_digits10(), based on numeric_limits if specialized,
71 // 0 for integer types, and log10(2) * digits() + 1 otherwise.
72 template <typename T, bool use_numeric_limits = std::numeric_limits<T>::is_specialized,
75  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static int run() { return std::numeric_limits<T>::max_digits10; }
76 };
77 
78 template <typename T>
79 struct default_max_digits10_impl<T, false, false> // Floating point
80 {
82  using std::ceil;
83  using std::log10;
84  typedef typename NumTraits<T>::Real Real;
86  }
87 };
88 
89 template <typename T>
90 struct default_max_digits10_impl<T, false, true> // Integer
91 {
92  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static int run() { return 0; }
93 };
94 
95 } // end namespace internal
96 
97 namespace numext {
100 // TODO: Replace by std::bit_cast (available in C++20)
101 template <typename Tgt, typename Src>
103  // The behaviour of memcpy is not specified for non-trivially copyable types
106  THIS_TYPE_IS_NOT_SUPPORTED)
107  EIGEN_STATIC_ASSERT(sizeof(Src) == sizeof(Tgt), THIS_TYPE_IS_NOT_SUPPORTED)
108 
109  Tgt tgt;
110  // Load src into registers first. This allows the memcpy to be elided by CUDA.
111  const Src staged = src;
112  EIGEN_USING_STD(memcpy)
113  memcpy(static_cast<void*>(&tgt), static_cast<const void*>(&staged), sizeof(Tgt));
114  return tgt;
115 }
116 } // namespace numext
117 
171 template <typename T>
173  enum {
175  IsSigned = std::numeric_limits<T>::is_signed,
178  ReadCost = 1,
179  AddCost = 1,
180  MulCost = 1
181  };
182 
183  typedef T Real;
184  typedef std::conditional_t<IsInteger, std::conditional_t<sizeof(T) <= 2, float, double>, T> NonInteger;
185  typedef T Nested;
186  typedef T Literal;
187 
189 
190  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline int digits10() { return internal::default_digits10_impl<T>::run(); }
191 
192  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline int max_digits10() {
194  }
195 
196  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline int digits() { return internal::default_digits_impl<T>::run(); }
197 
198  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline int min_exponent() { return numext::numeric_limits<T>::min_exponent; }
199 
200  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline int max_exponent() { return numext::numeric_limits<T>::max_exponent; }
201 
202  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline Real dummy_precision() {
203  // make sure to override this for floating-point types
204  return Real(0);
205  }
206 
207  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline T highest() { return (numext::numeric_limits<T>::max)(); }
208 
209  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline T lowest() { return (numext::numeric_limits<T>::lowest)(); }
210 
211  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline T infinity() { return numext::numeric_limits<T>::infinity(); }
212 
213  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline T quiet_NaN() { return numext::numeric_limits<T>::quiet_NaN(); }
214 };
215 
216 template <typename T>
218 
219 template <>
220 struct NumTraits<float> : GenericNumTraits<float> {
221  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline float dummy_precision() { return 1e-5f; }
222 };
223 
224 template <>
225 struct NumTraits<double> : GenericNumTraits<double> {
226  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline double dummy_precision() { return 1e-12; }
227 };
228 
229 // GPU devices treat `long double` as `double`.
230 #ifndef EIGEN_GPU_COMPILE_PHASE
231 template <>
232 struct NumTraits<long double> : GenericNumTraits<long double> {
233  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline long double dummy_precision() {
234  return static_cast<long double>(1e-15l);
235  }
236 
237 #if defined(EIGEN_ARCH_PPC) && (__LDBL_MANT_DIG__ == 106)
238  // PowerPC double double causes issues with some values
239  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline long double epsilon() {
240  // 2^(-(__LDBL_MANT_DIG__)+1)
241  return static_cast<long double>(2.4651903288156618919116517665087e-32l);
242  }
243 #endif
244 };
245 #endif
246 
247 template <typename Real_>
248 struct NumTraits<std::complex<Real_> > : GenericNumTraits<std::complex<Real_> > {
249  typedef Real_ Real;
251  enum {
258  };
259 
264 };
265 
266 template <typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols>
267 struct NumTraits<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> > {
273  typedef ArrayType& Nested;
275 
276  enum {
281  ReadCost = ArrayType::SizeAtCompileTime == Dynamic
282  ? HugeCost
283  : ArrayType::SizeAtCompileTime * int(NumTraits<Scalar>::ReadCost),
284  AddCost = ArrayType::SizeAtCompileTime == Dynamic ? HugeCost
285  : ArrayType::SizeAtCompileTime * int(NumTraits<Scalar>::AddCost),
286  MulCost = ArrayType::SizeAtCompileTime == Dynamic ? HugeCost
287  : ArrayType::SizeAtCompileTime * int(NumTraits<Scalar>::MulCost)
288  };
289 
293  }
294 
296  static inline int digits10() { return NumTraits<Scalar>::digits10(); }
298  static inline int max_digits10() { return NumTraits<Scalar>::max_digits10(); }
299 };
300 
301 template <>
302 struct NumTraits<std::string> : GenericNumTraits<std::string> {
304 
306  static inline int digits10() { return 0; }
308  static inline int max_digits10() { return 0; }
309 
310  private:
311  static inline std::string epsilon();
312  static inline std::string dummy_precision();
313  static inline std::string lowest();
314  static inline std::string highest();
315  static inline std::string infinity();
316  static inline std::string quiet_NaN();
317 };
318 
319 // Empty specialization for void to allow template specialization based on NumTraits<T>::Real with T==void and SFINAE.
320 template <>
321 struct NumTraits<void> {};
322 
323 template <>
324 struct NumTraits<bool> : GenericNumTraits<bool> {};
325 
326 } // end namespace Eigen
327 
328 #endif // EIGEN_NUMTRAITS_H
Array< double, 1, 3 > e(1./3., 0.5, 2.)
Eigen::Triplet< double > T
Definition: EigenUnitTest.cpp:11
#define EIGEN_USING_STD(FUNC)
Definition: Macros.h:1090
#define EIGEN_CONSTEXPR
Definition: Macros.h:758
#define EIGEN_DEVICE_FUNC
Definition: Macros.h:892
#define EIGEN_STRONG_INLINE
Definition: Macros.h:834
#define EIGEN_STATIC_ASSERT(X, MSG)
Definition: StaticAssert.h:26
bool is_integer(const Exponent &exp)
Definition: array_cwise.cpp:248
SCALAR Scalar
Definition: bench_gemm.cpp:45
boost::multiprecision::number< boost::multiprecision::cpp_dec_float< 100 >, boost::multiprecision::et_on > Real
Definition: boostmultiprec.cpp:77
General-purpose arrays with easy API for coefficient-wise operations.
Definition: Array.h:48
#define max(a, b)
Definition: datatypes.h:23
return int(ret)+1
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 floor(const bfloat16 &a)
Definition: BFloat16.h:643
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 ceil(const bfloat16 &a)
Definition: BFloat16.h:644
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 log10(const bfloat16 &a)
Definition: BFloat16.h:620
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Tgt bit_cast(const Src &src)
Definition: NumTraits.h:102
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
squared absolute value
Definition: GlobalFunctions.h:87
const int HugeCost
Definition: Constants.h:48
const int Dynamic
Definition: Constants.h:25
Definition: Eigen_Colamd.h:49
std::string string(const unsigned &i)
Definition: oomph_definitions.cc:286
double epsilon
Definition: osc_ring_sarah_asymptotics.h:43
Scalar log2(Scalar x)
Definition: packetmath.cpp:754
Definition: NumTraits.h:172
@ RequireInitialization
Definition: NumTraits.h:177
@ IsSigned
Definition: NumTraits.h:175
@ ReadCost
Definition: NumTraits.h:178
@ AddCost
Definition: NumTraits.h:179
@ IsInteger
Definition: NumTraits.h:174
@ IsComplex
Definition: NumTraits.h:176
@ MulCost
Definition: NumTraits.h:180
T Real
Definition: NumTraits.h:183
NumTraits< Scalar >::Real RealScalar
Definition: NumTraits.h:269
EIGEN_DEVICE_FUNC static EIGEN_CONSTEXPR RealScalar epsilon()
Definition: NumTraits.h:290
NumTraits< Scalar >::Literal Literal
Definition: NumTraits.h:274
EIGEN_DEVICE_FUNC static EIGEN_CONSTEXPR RealScalar dummy_precision()
Definition: NumTraits.h:291
NumTraits< Scalar >::NonInteger NonIntegerScalar
Definition: NumTraits.h:271
Array< RealScalar, Rows, Cols, Options, MaxRows, MaxCols > Real
Definition: NumTraits.h:270
static EIGEN_CONSTEXPR int max_digits10()
Definition: NumTraits.h:298
Array< Scalar, Rows, Cols, Options, MaxRows, MaxCols > ArrayType
Definition: NumTraits.h:268
static EIGEN_CONSTEXPR int digits10()
Definition: NumTraits.h:296
Array< NonIntegerScalar, Rows, Cols, Options, MaxRows, MaxCols > NonInteger
Definition: NumTraits.h:272
EIGEN_DEVICE_FUNC static EIGEN_CONSTEXPR double dummy_precision()
Definition: NumTraits.h:226
EIGEN_DEVICE_FUNC static EIGEN_CONSTEXPR float dummy_precision()
Definition: NumTraits.h:221
EIGEN_DEVICE_FUNC static EIGEN_CONSTEXPR long double dummy_precision()
Definition: NumTraits.h:233
Real_ Real
Definition: NumTraits.h:249
EIGEN_DEVICE_FUNC static EIGEN_CONSTEXPR Real epsilon()
Definition: NumTraits.h:260
EIGEN_DEVICE_FUNC static EIGEN_CONSTEXPR int digits10()
Definition: NumTraits.h:262
EIGEN_DEVICE_FUNC static EIGEN_CONSTEXPR Real dummy_precision()
Definition: NumTraits.h:261
NumTraits< Real_ >::Literal Literal
Definition: NumTraits.h:250
EIGEN_DEVICE_FUNC static EIGEN_CONSTEXPR int max_digits10()
Definition: NumTraits.h:263
static std::string infinity()
static EIGEN_CONSTEXPR int max_digits10()
Definition: NumTraits.h:308
static std::string quiet_NaN()
static EIGEN_CONSTEXPR int digits10()
Definition: NumTraits.h:306
static std::string dummy_precision()
static std::string epsilon()
static std::string highest()
static std::string lowest()
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:217
EIGEN_DEVICE_FUNC static EIGEN_CONSTEXPR int run()
Definition: NumTraits.h:56
EIGEN_DEVICE_FUNC static EIGEN_CONSTEXPR int run()
Definition: NumTraits.h:67
Definition: NumTraits.h:49
EIGEN_DEVICE_FUNC static EIGEN_CONSTEXPR int run()
Definition: NumTraits.h:50
EIGEN_DEVICE_FUNC static EIGEN_CONSTEXPR int run()
Definition: NumTraits.h:31
EIGEN_DEVICE_FUNC static EIGEN_CONSTEXPR int run()
Definition: NumTraits.h:42
Definition: NumTraits.h:24
EIGEN_DEVICE_FUNC static EIGEN_CONSTEXPR int run()
Definition: NumTraits.h:25
EIGEN_DEVICE_FUNC static EIGEN_CONSTEXPR int run()
Definition: NumTraits.h:81
EIGEN_DEVICE_FUNC static EIGEN_CONSTEXPR int run()
Definition: NumTraits.h:92
EIGEN_DEVICE_FUNC static EIGEN_CONSTEXPR int run()
Definition: NumTraits.h:75
Definition: Meta.h:145
Definition: datatypes.h:12