Files
eigen/doc/TopicScalarTypes.dox

69 lines
3.8 KiB
Plaintext

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 unsupported module <a href="unsupported/group__MPRealSupport__Module.html">MPRealSupport</a>.
*/
}