summaryrefslogtreecommitdiffstats
path: root/libcxx/test/support/fp_compare.h
diff options
context:
space:
mode:
Diffstat (limited to 'libcxx/test/support/fp_compare.h')
-rw-r--r--libcxx/test/support/fp_compare.h46
1 files changed, 46 insertions, 0 deletions
diff --git a/libcxx/test/support/fp_compare.h b/libcxx/test/support/fp_compare.h
new file mode 100644
index 00000000000..f14ea96f579
--- /dev/null
+++ b/libcxx/test/support/fp_compare.h
@@ -0,0 +1,46 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+#ifndef SUPPORT_FP_COMPARE_H
+#define SUPPORT_FP_COMPARE_H
+
+#include <cmath> // for std::abs
+#include <algorithm> // for std::max
+#include <cassert>
+
+// See https://www.boost.org/doc/libs/1_70_0/libs/test/doc/html/boost_test/testing_tools/extended_comparison/floating_point/floating_points_comparison_theory.html
+
+template<typename T>
+bool fptest_close(T val, T expected, T eps)
+{
+ constexpr T zero = T(0);
+ assert(eps >= zero);
+
+// Handle the zero cases
+ if (eps == zero) return val == expected;
+ if (val == zero) return std::abs(expected) <= eps;
+ if (expected == zero) return std::abs(val) <= eps;
+
+ return std::abs(val - expected) < eps
+ && std::abs(val - expected)/std::abs(val) < eps;
+}
+
+template<typename T>
+bool fptest_close_pct(T val, T expected, T percent)
+{
+ constexpr T zero = T(0);
+ assert(percent >= zero);
+
+// Handle the zero cases
+ if (percent == zero) return val == expected;
+ T eps = (percent / T(100)) * std::max(std::abs(val), std::abs(expected));
+
+ return fptest_close(val, expected, eps);
+}
+
+
+#endif // SUPPORT_FP_COMPARE_H
OpenPOWER on IntegriCloud