aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/stable_norm.cpp
diff options
context:
space:
mode:
authorGravatar Benoit Jacob <jacob.benoit.1@gmail.com>2011-02-18 09:46:49 -0500
committerGravatar Benoit Jacob <jacob.benoit.1@gmail.com>2011-02-18 09:46:49 -0500
commitaa966ca319bb2cce3f7f1eef0062fb7bc7534b6e (patch)
tree2445b33287e79af9597a80ecc3d3bab8f337ee74 /test/stable_norm.cpp
parent8f8c67b8bd2915d1927c848e557e5076a00e25f9 (diff)
fix bug #187: stable norm test was quite broken
Diffstat (limited to 'test/stable_norm.cpp')
-rw-r--r--test/stable_norm.cpp28
1 files changed, 13 insertions, 15 deletions
diff --git a/test/stable_norm.cpp b/test/stable_norm.cpp
index 69e4a1b12..4480c5203 100644
--- a/test/stable_norm.cpp
+++ b/test/stable_norm.cpp
@@ -24,9 +24,19 @@
#include "main.h"
+template<typename T> bool isNotNaN(const T& x)
+{
+ return x==x;
+}
+
template<typename T> bool isFinite(const T& x)
{
- return x==x && x>=NumTraits<T>::lowest() && x<=NumTraits<T>::highest();
+ return isNotNaN(x-x);
+}
+
+template<typename T> EIGEN_DONT_INLINE T copy(const T& x)
+{
+ return x;
}
template<typename MatrixType> void stable_norm(const MatrixType& m)
@@ -79,26 +89,14 @@ template<typename MatrixType> void stable_norm(const MatrixType& m)
// test overflow
VERIFY(isFinite(internal::sqrt(size)*internal::abs(big)));
- #ifdef EIGEN_VECTORIZE_SSE
- // since x87 FPU uses 80bits of precision overflow is not detected
- if(internal::packet_traits<Scalar>::size>1)
- {
- VERIFY_IS_NOT_APPROX(static_cast<Scalar>(vbig.norm()), internal::sqrt(size)*big); // here the default norm must fail
- }
- #endif
+ VERIFY_IS_NOT_APPROX(internal::sqrt(copy(vbig.squaredNorm())), internal::abs(internal::sqrt(size)*big)); // here the default norm must fail
VERIFY_IS_APPROX(vbig.stableNorm(), internal::sqrt(size)*internal::abs(big));
VERIFY_IS_APPROX(vbig.blueNorm(), internal::sqrt(size)*internal::abs(big));
VERIFY_IS_APPROX(vbig.hypotNorm(), internal::sqrt(size)*internal::abs(big));
// test underflow
VERIFY(isFinite(internal::sqrt(size)*internal::abs(small)));
- #ifdef EIGEN_VECTORIZE_SSE
- // since x87 FPU uses 80bits of precision underflow is not detected
- if(internal::packet_traits<Scalar>::size>1)
- {
- VERIFY_IS_NOT_APPROX(static_cast<Scalar>(vsmall.norm()), internal::sqrt(size)*small); // here the default norm must fail
- }
- #endif
+ VERIFY_IS_NOT_APPROX(internal::sqrt(copy(vsmall.squaredNorm())), internal::abs(internal::sqrt(size)*small)); // here the default norm must fail
VERIFY_IS_APPROX(vsmall.stableNorm(), internal::sqrt(size)*internal::abs(small));
VERIFY_IS_APPROX(vsmall.blueNorm(), internal::sqrt(size)*internal::abs(small));
VERIFY_IS_APPROX(vsmall.hypotNorm(), internal::sqrt(size)*internal::abs(small));