diff options
| author | Siva Chandra Reddy <sivachandra@google.com> | 2020-06-02 14:04:57 -0700 |
|---|---|---|
| committer | Siva Chandra Reddy <sivachandra@google.com> | 2020-06-11 12:23:11 -0700 |
| commit | 118c13c691a5b3b0c5760061a89d5ef7a319c15b (patch) | |
| tree | 255b838742255c4c9f5b9e58e04710b86a7182a9 /libc/test/src/math/copysign_test.cpp | |
| parent | 269d843720382a8beafdf156cd01f9791faff66c (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.cpp | 63 |
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); + } +} |
