summaryrefslogtreecommitdiff
path: root/libc/test/src/math/copysign_test.cpp
diff options
context:
space:
mode:
authorSiva Chandra Reddy <sivachandra@google.com>2020-06-02 14:04:57 -0700
committerSiva Chandra Reddy <sivachandra@google.com>2020-06-11 12:23:11 -0700
commit118c13c691a5b3b0c5760061a89d5ef7a319c15b (patch)
tree255b838742255c4c9f5b9e58e04710b86a7182a9 /libc/test/src/math/copysign_test.cpp
parent269d843720382a8beafdf156cd01f9791faff66c (diff)
[libc] Add implementation of few floating point manipulation functions.
Implementations of copysign[f], frexp[f], logb[f], and modf[f] are added. Reviewers: asteinhauser Differential Revision: https://reviews.llvm.org/D81134
Diffstat (limited to 'libc/test/src/math/copysign_test.cpp')
-rw-r--r--libc/test/src/math/copysign_test.cpp63
1 files changed, 63 insertions, 0 deletions
diff --git a/libc/test/src/math/copysign_test.cpp b/libc/test/src/math/copysign_test.cpp
new file mode 100644
index 000000000000..e0638467c5b9
--- /dev/null
+++ b/libc/test/src/math/copysign_test.cpp
@@ -0,0 +1,63 @@
+//===-- Unittests for copysign --------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "include/math.h"
+#include "src/math/copysign.h"
+#include "utils/FPUtil/BitPatterns.h"
+#include "utils/FPUtil/FloatOperations.h"
+#include "utils/FPUtil/FloatProperties.h"
+#include "utils/UnitTest/Test.h"
+
+using __llvm_libc::fputil::valueAsBits;
+using __llvm_libc::fputil::valueFromBits;
+
+using BitPatterns = __llvm_libc::fputil::BitPatterns<double>;
+using Properties = __llvm_libc::fputil::FloatProperties<double>;
+
+TEST(CopySignTest, SpecialNumbers) {
+ EXPECT_EQ(BitPatterns::aNegativeQuietNaN,
+ valueAsBits(__llvm_libc::copysign(
+ valueFromBits(BitPatterns::aQuietNaN), -1.0)));
+ EXPECT_EQ(BitPatterns::aQuietNaN,
+ valueAsBits(__llvm_libc::copysign(
+ valueFromBits(BitPatterns::aNegativeQuietNaN), 1.0)));
+
+ EXPECT_EQ(BitPatterns::aNegativeSignallingNaN,
+ valueAsBits(__llvm_libc::copysign(
+ valueFromBits(BitPatterns::aSignallingNaN), -1.0)));
+ EXPECT_EQ(BitPatterns::aSignallingNaN,
+ valueAsBits(__llvm_libc::copysign(
+ valueFromBits(BitPatterns::aNegativeSignallingNaN), 1.0)));
+
+ EXPECT_EQ(BitPatterns::negInf, valueAsBits(__llvm_libc::copysign(
+ valueFromBits(BitPatterns::inf), -1.0)));
+ EXPECT_EQ(BitPatterns::inf, valueAsBits(__llvm_libc::copysign(
+ valueFromBits(BitPatterns::negInf), 1.0)));
+
+ EXPECT_EQ(BitPatterns::negZero, valueAsBits(__llvm_libc::copysign(
+ valueFromBits(BitPatterns::zero), -1.0)));
+ EXPECT_EQ(BitPatterns::zero, valueAsBits(__llvm_libc::copysign(
+ valueFromBits(BitPatterns::negZero), 1.0)));
+}
+
+TEST(CopySignTest, InDoubleRange) {
+ using BitsType = Properties::BitsType;
+ constexpr BitsType count = 1000000;
+ constexpr BitsType step = UINT64_MAX / count;
+ for (BitsType i = 0, v = 0; i <= count; ++i, v += step) {
+ double x = valueFromBits(v);
+ if (isnan(x) || isinf(x) || x == 0)
+ continue;
+
+ double res1 = __llvm_libc::copysign(x, -x);
+ ASSERT_TRUE(res1 == -x);
+
+ double res2 = __llvm_libc::copysign(x, x);
+ ASSERT_TRUE(res2 == x);
+ }
+}