diff --git a/test/main.h b/test/main.h index 51eca5453..d1c3dc10f 100644 --- a/test/main.h +++ b/test/main.h @@ -541,4 +541,3 @@ int main(int argc, char *argv[]) EIGEN_CAT(test_,EIGEN_TEST_FUNC)(); return 0; } - 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 bool isNotNaN(const T& x) +{ + return x==x; +} + template bool isFinite(const T& x) { - return x==x && x>=NumTraits::lowest() && x<=NumTraits::highest(); + return isNotNaN(x-x); +} + +template EIGEN_DONT_INLINE T copy(const T& x) +{ + return x; } template void stable_norm(const MatrixType& m) @@ -79,26 +89,14 @@ template 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::size>1) - { - VERIFY_IS_NOT_APPROX(static_cast(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::size>1) - { - VERIFY_IS_NOT_APPROX(static_cast(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));