diff options
author | Gael Guennebaud <g.gael@free.fr> | 2015-06-17 16:11:58 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2015-06-17 16:11:58 +0200 |
commit | bb6acc561e5b65ac2bb09370ed98d2594f49f8a2 (patch) | |
tree | 28e2f1298dbc7eba9b6308980e84f9ae6a92b383 /test/stable_norm.cpp | |
parent | 40f326ef2ecf50022b082ec09bc9e545f19ebf6f (diff) |
Workaround broken complex*real product on old clang versions
Diffstat (limited to 'test/stable_norm.cpp')
-rw-r--r-- | test/stable_norm.cpp | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/test/stable_norm.cpp b/test/stable_norm.cpp index 21fae494b..99cb0d5a6 100644 --- a/test/stable_norm.cpp +++ b/test/stable_norm.cpp @@ -24,6 +24,8 @@ template<typename MatrixType> void stable_norm(const MatrixType& m) typedef typename MatrixType::Index Index; typedef typename MatrixType::Scalar Scalar; typedef typename NumTraits<Scalar>::Real RealScalar; + + bool complex_real_product_ok = true; // Check the basic machine-dependent constants. { @@ -36,6 +38,16 @@ template<typename MatrixType> void stable_norm(const MatrixType& m) VERIFY( (!(iemin > 1 - 2*it || 1+it>iemax || (it==2 && ibeta<5) || (it<=4 && ibeta <= 3 ) || it<2)) && "the stable norm algorithm cannot be guaranteed on this computer"); + + Scalar inf = std::numeric_limits<RealScalar>::infinity(); + if(NumTraits<Scalar>::IsComplex && numext::isnan(inf*RealScalar(1)) ) + { + complex_real_product_ok = false; + static bool first = true; + if(first) + std::cerr << "WARNING: compiler mess up complex*real product, " << inf << " * " << 1.0 << " = " << inf*RealScalar(1) << std::endl; + first = false; + } } @@ -116,7 +128,10 @@ template<typename MatrixType> void stable_norm(const MatrixType& m) v(i,j) = std::numeric_limits<RealScalar>::infinity(); VERIFY(!numext::isfinite(v.squaredNorm())); VERIFY(isPlusInf(v.squaredNorm())); VERIFY(!numext::isfinite(v.norm())); VERIFY(isPlusInf(v.norm())); - VERIFY(!numext::isfinite(v.stableNorm())); VERIFY(isPlusInf(v.stableNorm())); + VERIFY(!numext::isfinite(v.stableNorm())); + if(complex_real_product_ok){ + VERIFY(isPlusInf(v.stableNorm())); + } VERIFY(!numext::isfinite(v.blueNorm())); VERIFY(isPlusInf(v.blueNorm())); VERIFY(!numext::isfinite(v.hypotNorm())); VERIFY(isPlusInf(v.hypotNorm())); } @@ -127,7 +142,10 @@ template<typename MatrixType> void stable_norm(const MatrixType& m) v(i,j) = -std::numeric_limits<RealScalar>::infinity(); VERIFY(!numext::isfinite(v.squaredNorm())); VERIFY(isPlusInf(v.squaredNorm())); VERIFY(!numext::isfinite(v.norm())); VERIFY(isPlusInf(v.norm())); - VERIFY(!numext::isfinite(v.stableNorm())); VERIFY(isPlusInf(v.stableNorm())); + VERIFY(!numext::isfinite(v.stableNorm())); + if(complex_real_product_ok) { + VERIFY(isPlusInf(v.stableNorm())); + } VERIFY(!numext::isfinite(v.blueNorm())); VERIFY(isPlusInf(v.blueNorm())); VERIFY(!numext::isfinite(v.hypotNorm())); VERIFY(isPlusInf(v.hypotNorm())); } |