| Elements
    6.2
    A C++ base framework for the Euclid Software. | 
Floating point comparison implementations. More...
#include <cmath>#include <cstring>#include <limits>#include <type_traits>#include "ElementsKernel/Export.h"#include "ElementsKernel/Unused.h"

Go to the source code of this file.
| Namespaces | |
| Elements | |
| Functions | |
| template<typename RawType > | |
| constexpr std::size_t | Elements::defaultMaxUlps () | 
| template<> | |
| constexpr std::size_t | Elements::defaultMaxUlps< float > () | 
| template<> | |
| constexpr std::size_t | Elements::defaultMaxUlps< double > () | 
| template<typename FloatType > | |
| bool | Elements::almostEqual2sComplement (ELEMENTS_UNUSED const FloatType &a, ELEMENTS_UNUSED const FloatType &b, ELEMENTS_UNUSED const std::size_t &max_ulps=0) | 
| template<typename RawType > | |
| bool | Elements::isNan (const RawType &x) | 
| template<typename RawType , std::size_t max_ulps = defaultMaxUlps<RawType>()> | |
| bool | Elements::isEqual (const RawType &left, const RawType &right) | 
| template<std::size_t max_ulps> | |
| bool | Elements::isEqual (const float &left, const float &right) | 
| template<std::size_t max_ulps> | |
| bool | Elements::isEqual (const double &left, const double &right) | 
| template<typename RawType , std::size_t max_ulps = defaultMaxUlps<RawType>()> | |
| bool | Elements::isNotEqual (const RawType &left, const RawType &right) | 
| template<std::size_t max_ulps> | |
| bool | Elements::isNotEqual (const float &left, const float &right) | 
| template<std::size_t max_ulps> | |
| bool | Elements::isNotEqual (const double &left, const double &right) | 
| template<typename RawType , std::size_t max_ulps = defaultMaxUlps<RawType>()> | |
| bool | Elements::isLess (const RawType &left, const RawType &right) | 
| template<std::size_t max_ulps> | |
| bool | Elements::isLess (const float &left, const float &right) | 
| template<std::size_t max_ulps> | |
| bool | Elements::isLess (const double &left, const double &right) | 
| template<typename RawType , std::size_t max_ulps = defaultMaxUlps<RawType>()> | |
| bool | Elements::isGreater (const RawType &left, const RawType &right) | 
| template<std::size_t max_ulps> | |
| bool | Elements::isGreater (const float &left, const float &right) | 
| template<std::size_t max_ulps> | |
| bool | Elements::isGreater (const double &left, const double &right) | 
| template<typename RawType , std::size_t max_ulps = defaultMaxUlps<RawType>()> | |
| bool | Elements::isLessOrEqual (const RawType &left, const RawType &right) | 
| template<std::size_t max_ulps> | |
| bool | Elements::isLessOrEqual (const float &left, const float &right) | 
| template<std::size_t max_ulps> | |
| bool | Elements::isLessOrEqual (const double &left, const double &right) | 
| template<typename RawType , std::size_t max_ulps = defaultMaxUlps<RawType>()> | |
| bool | Elements::isGreaterOrEqual (const RawType &left, const RawType &right) | 
| template<std::size_t max_ulps> | |
| bool | Elements::isGreaterOrEqual (const float &left, const float &right) | 
| template<std::size_t max_ulps> | |
| bool | Elements::isGreaterOrEqual (const double &left, const double &right) | 
| ELEMENTS_API bool | Elements::almostEqual2sComplement (const float &left, const float &right, const int &max_ulps=FLT_DEFAULT_MAX_ULPS) | 
| This function compare 2 floats with a relative tolerance.  More... | |
| ELEMENTS_API bool | Elements::almostEqual2sComplement (const double &left, const double &right, const int &max_ulps=DBL_DEFAULT_MAX_ULPS) | 
| This function compare 2 doubles with a relative tolerance.  More... | |
| template<typename RawType > | |
| ELEMENTS_API bool | Elements::realBitWiseEqual (const RawType &left, const RawType &right) | 
| This function compares 2 floating point numbers bitwise. These are the strict equivalent of the "==". They are only here for the example.  More... | |
| Variables | |
| constexpr std::size_t | Elements::FLT_DEFAULT_MAX_ULPS {4} | 
| Single precision float default maximum unit in the last place.  More... | |
| constexpr std::size_t | Elements::DBL_DEFAULT_MAX_ULPS {10} | 
| Double precision float default maximum unit in the last place.  More... | |
| const ELEMENTS_API double | Elements::FLT_DEFAULT_TEST_TOLERANCE = pow(10.0, -numeric_limits<float>::digits10) | 
| Single precision float default test tolerance.  More... | |
| const ELEMENTS_API double | Elements::DBL_DEFAULT_TEST_TOLERANCE = pow(10.0, -numeric_limits<double>::digits10) | 
| Double precision float default test tolerance.  More... | |
Floating point comparison implementations.
This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3.0 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Due to the finite representation of the real numbers in the computing architecture, the comparison between 2 floating point numbers needs to be done carefully. In details, even if the representation bit-wise of 2 numbers is different, the real numbers they represent might be the same.
In essence, this is equivalent to compare the 2 numbers \(x\) and \(y\) with a relative tolerance number \(\epsilon\):
\[ |x-y| \leq \epsilon |x+y| \]
Definition in file Real.h.
 1.8.17
 1.8.17