aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/stable_norm.cpp
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2015-06-17 16:11:58 +0200
committerGravatar Gael Guennebaud <g.gael@free.fr>2015-06-17 16:11:58 +0200
commitbb6acc561e5b65ac2bb09370ed98d2594f49f8a2 (patch)
tree28e2f1298dbc7eba9b6308980e84f9ae6a92b383 /test/stable_norm.cpp
parent40f326ef2ecf50022b082ec09bc9e545f19ebf6f (diff)
Workaround broken complex*real product on old clang versions
Diffstat (limited to 'test/stable_norm.cpp')
-rw-r--r--test/stable_norm.cpp22
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()));
}