summaryrefslogtreecommitdiff
path: root/test/correctness/tester.cpp
diff options
context:
space:
mode:
authorCedric Nugteren <web@cedricnugteren.nl>2017-02-19 17:43:26 +0100
committerCedric Nugteren <web@cedricnugteren.nl>2017-02-19 17:43:26 +0100
commit133ebfc83414c4aa0e8fce9f6f7b9d43e6774380 (patch)
tree572c3754bac2522328d3653766c0a2267843553c /test/correctness/tester.cpp
parentc248f900c036e1d1644e2cc744c45c94f61c5835 (diff)
Added data-preparation function for the TRSV tests and special nan/inf checks in the error checking to make the tests pass
Diffstat (limited to 'test/correctness/tester.cpp')
-rw-r--r--test/correctness/tester.cpp21
1 files changed, 19 insertions, 2 deletions
diff --git a/test/correctness/tester.cpp b/test/correctness/tester.cpp
index c0ed5ba4..dd2f3f99 100644
--- a/test/correctness/tester.cpp
+++ b/test/correctness/tester.cpp
@@ -40,6 +40,12 @@ float getAbsoluteErrorMargin<half>() {
return 0.10f; // especially small values are inaccurate for half-precision
}
+// Error margin: numbers beyond this value are considered equal to inf or NaN
+template <typename T>
+T getAlmostInfNumber() {
+ return T{1e35}; // used for correctness testing of TRSV and TRSM routines
+}
+
// Maximum number of test results printed on a single line
template <typename T, typename U> const size_t Tester<T,U>::kResultsPerLine = size_t{64};
@@ -426,8 +432,19 @@ bool TestSimilarityNear(const T val1, const T val2,
if (val1 == val2) {
return true;
}
- // Handles cases with both results NaN
- else if (std::isnan(val1) && std::isnan(val2)) {
+ // Handles cases with both results NaN or inf
+ else if ((std::isnan(val1) && std::isnan(val2)) || (std::isinf(val1) && std::isinf(val2))) {
+ return true;
+ }
+ // Also considers it OK if one of the results in NaN and the other is inf
+ // Note: for TRSV and TRSM routines
+ else if ((std::isnan(val1) && std::isinf(val2)) || (std::isinf(val1) && std::isnan(val2))) {
+ return true;
+ }
+ // Also considers it OK if one of the values is super large and the other is inf or NaN
+ // Note: for TRSV and TRSM routines
+ else if ((std::abs(val1) > getAlmostInfNumber<T>() && (std::isinf(val2) || std::isnan(val2))) ||
+ (std::abs(val2) > getAlmostInfNumber<T>() && (std::isinf(val1) || std::isnan(val1)))) {
return true;
}
// The values are zero or very small: the relative error is less meaningful