summaryrefslogtreecommitdiffstats
path: root/libcxx/test/support
diff options
context:
space:
mode:
authorMarshall Clow <mclow.lists@gmail.com>2019-04-25 12:11:43 +0000
committerMarshall Clow <mclow.lists@gmail.com>2019-04-25 12:11:43 +0000
commitd3d0ecbfd52cca2c7e0f4478e5682c493fd99ef2 (patch)
treefbac170739e7b24bba17e84dfa2fe7d4cb2e9841 /libcxx/test/support
parent31aa2ea3a3f9669e5783654117804f055f787f7a (diff)
downloadbcm5719-llvm-d3d0ecbfd52cca2c7e0f4478e5682c493fd99ef2.tar.gz
bcm5719-llvm-d3d0ecbfd52cca2c7e0f4478e5682c493fd99ef2.zip
Implement midpoint for floating point types. Reviewed as https://reviews.llvm.org/D61014.
llvm-svn: 359184
Diffstat (limited to 'libcxx/test/support')
-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