| namespace Eigen { |
| |
| /** \page TopicScalarTypes Scalar types |
| |
| The \c Scalar template parameter of Matrix, Array, SparseMatrix, and the other %Eigen containers |
| determines the type of the coefficients. This page lists the scalar types that work out of the box |
| and points to the mechanism for adding new ones. |
| |
| \eigenAutoToc |
| |
| \section TopicScalarTypesBuiltin Supported scalar types |
| |
| The following types are supported without any additional work: |
| |
| - the standard floating-point types \c float, \c double, and <tt>long double</tt>; |
| - <tt>std::complex</tt> of any of those, most commonly <tt>std::complex<float></tt> and |
| <tt>std::complex<double></tt>; |
| - all standard integer types, signed and unsigned (e.g. \c int, <tt>unsigned int</tt>, |
| \c short, <tt>std::int64_t</tt>, ...); |
| - \c bool, with the arithmetic operators interpreted in the Boolean semiring |
| (see \ref TopicPitfalls_matrix_bool); |
| - the reduced-precision floating-point types \c Eigen::half (IEEE binary16) and |
| \c Eigen::bfloat16, which %Eigen provides itself in Eigen/Core. |
| |
| A few practical notes: |
| |
| - <b>Convenience typedefs</b> such as \c MatrixXd or \c Vector4i exist for \c float, \c double, |
| \c int, and the two standard complex types; for every other scalar type simply spell out |
| <tt>Matrix<Scalar, Rows, Cols></tt> or define your own typedef. |
| - <b>Mixing scalar types</b> in one expression is not done implicitly: adding a \c float matrix |
| to a \c double matrix is a compile-time error. Convert explicitly with |
| <tt>.cast<NewScalar>()</tt>. The exceptions are the documented |
| real-times-complex combinations, e.g. multiplying a real matrix by a complex scalar. |
| - <b>Integer scalars</b> use exact arithmetic, with the usual C++ caveats: overflow wraps or is |
| undefined depending on signedness, and division truncates. Decompositions and other |
| algorithms that require field operations are meant for floating-point (or rational custom) |
| scalars, not for integer types. |
| - <b><tt>long double</tt></b> follows the platform's definition (80-bit extended precision on |
| x86 Linux, 128-bit on some platforms, plain \c double on MSVC). It is never vectorized. |
| - <b>\c Eigen::half and \c Eigen::bfloat16</b> are primarily storage and interchange formats: |
| on hardware without native arithmetic, operations are emulated by converting to \c float and |
| back. Both are vectorized on instruction sets with hardware support (see |
| \ref TopicVectorization). |
| |
| The scalar types with vectorized kernels for a given instruction set are listed on the |
| \ref TopicVectorization "vectorization page"; every supported scalar type also works through the |
| scalar code paths. |
| |
| \section TopicScalarTypesTraits NumTraits |
| |
| The properties of a scalar type are centralized in the NumTraits class template: whether the type |
| is integer, signed, or complex, the corresponding real type (e.g. \c float for |
| <tt>std::complex<float></tt>), machine epsilon, and the tolerances used by the fuzzy comparison |
| functions such as isApprox(). Generic code should query NumTraits and use the math functions from |
| the \c Eigen::numext namespace (numext::sqrt, numext::abs2, ...) rather than hard-coding |
| properties of \c float or \c double, so that it keeps working for every supported scalar type. |
| |
| \section TopicScalarTypesCustom Custom scalar types |
| |
| Any user-defined type with the usual arithmetic operators can be used as a scalar type after |
| specializing NumTraits for it and providing the math functions that make sense for the type. The |
| full recipe, with complete examples (an automatic-differentiation type and a GMP rational type), |
| is given in \ref TopicCustomizing_CustomScalar. Ready-made support for the MPFR arbitrary-precision |
| type is available in the contrib module <a href="contrib/group__MPRealSupport__Module.html">MPRealSupport</a>. |
| |
| */ |
| |
| } |