1 //===-- Unittests for copysign --------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "include/math.h"
10 #include "src/math/copysign.h"
11 #include "utils/FPUtil/BitPatterns.h"
12 #include "utils/FPUtil/FloatOperations.h"
13 #include "utils/FPUtil/FloatProperties.h"
14 #include "utils/UnitTest/Test.h"
15 
16 using __llvm_libc::fputil::valueAsBits;
17 using __llvm_libc::fputil::valueFromBits;
18 
19 using BitPatterns = __llvm_libc::fputil::BitPatterns<double>;
20 using Properties = __llvm_libc::fputil::FloatProperties<double>;
21 
22 TEST(CopySignTest, SpecialNumbers) {
23   EXPECT_EQ(BitPatterns::aNegativeQuietNaN,
24             valueAsBits(__llvm_libc::copysign(
25                 valueFromBits(BitPatterns::aQuietNaN), -1.0)));
26   EXPECT_EQ(BitPatterns::aQuietNaN,
27             valueAsBits(__llvm_libc::copysign(
28                 valueFromBits(BitPatterns::aNegativeQuietNaN), 1.0)));
29 
30   EXPECT_EQ(BitPatterns::aNegativeSignallingNaN,
31             valueAsBits(__llvm_libc::copysign(
32                 valueFromBits(BitPatterns::aSignallingNaN), -1.0)));
33   EXPECT_EQ(BitPatterns::aSignallingNaN,
34             valueAsBits(__llvm_libc::copysign(
35                 valueFromBits(BitPatterns::aNegativeSignallingNaN), 1.0)));
36 
37   EXPECT_EQ(BitPatterns::negInf, valueAsBits(__llvm_libc::copysign(
38                                      valueFromBits(BitPatterns::inf), -1.0)));
39   EXPECT_EQ(BitPatterns::inf, valueAsBits(__llvm_libc::copysign(
40                                   valueFromBits(BitPatterns::negInf), 1.0)));
41 
42   EXPECT_EQ(BitPatterns::negZero, valueAsBits(__llvm_libc::copysign(
43                                       valueFromBits(BitPatterns::zero), -1.0)));
44   EXPECT_EQ(BitPatterns::zero, valueAsBits(__llvm_libc::copysign(
45                                    valueFromBits(BitPatterns::negZero), 1.0)));
46 }
47 
48 TEST(CopySignTest, InDoubleRange) {
49   using BitsType = Properties::BitsType;
50   constexpr BitsType count = 1000000;
51   constexpr BitsType step = UINT64_MAX / count;
52   for (BitsType i = 0, v = 0; i <= count; ++i, v += step) {
53     double x = valueFromBits(v);
54     if (isnan(x) || isinf(x) || x == 0)
55       continue;
56 
57     double res1 = __llvm_libc::copysign(x, -x);
58     ASSERT_TRUE(res1 == -x);
59 
60     double res2 = __llvm_libc::copysign(x, x);
61     ASSERT_TRUE(res2 == x);
62   }
63 }
64