Fix epsilon and dummy_precision values in long double for double doubles. Prevented some algorithms from converging on PPC.

This commit is contained in:
Chip Kerchner
2023-02-16 23:35:42 +00:00
committed by Rasmus Munk Larsen
parent a16fb889dd
commit 54459214a1
4 changed files with 17 additions and 7 deletions

View File

@@ -246,8 +246,18 @@ template<> struct NumTraits<double> : GenericNumTraits<double>
template<> struct NumTraits<long double>
: GenericNumTraits<long double>
{
EIGEN_CONSTEXPR
static inline long double dummy_precision() { return 1e-15l; }
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
static inline long double dummy_precision() { return static_cast<long double>(1e-15l); }
#if defined(EIGEN_ARCH_PPC) && (__LDBL_MANT_DIG__ == 106)
// PowerPC double double causes issues with some values
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
static inline long double epsilon()
{
// 2^(-(__LDBL_MANT_DIG__)+1)
return static_cast<long double>(2.4651903288156618919116517665087e-32l);
}
#endif
};
template<typename Real_> struct NumTraits<std::complex<Real_> >