1 //===-- Unittests for frexpf ----------------------------------------------===//
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/frexpf.h"
11 #include "utils/FPUtil/BasicOperations.h"
12 #include "utils/FPUtil/BitPatterns.h"
13 #include "utils/FPUtil/ClassificationFunctions.h"
14 #include "utils/FPUtil/FloatOperations.h"
15 #include "utils/FPUtil/FloatProperties.h"
16 #include "utils/MPFRWrapper/MPFRUtils.h"
17 #include "utils/UnitTest/Test.h"
18 
19 using __llvm_libc::fputil::valueAsBits;
20 using __llvm_libc::fputil::valueFromBits;
21 
22 using BitPatterns = __llvm_libc::fputil::BitPatterns<float>;
23 using Properties = __llvm_libc::fputil::FloatProperties<float>;
24 
25 TEST(FrexpfTest, SpecialNumbers) {
26   int exponent;
27 
28   EXPECT_EQ(BitPatterns::aQuietNaN,
29             valueAsBits(__llvm_libc::frexpf(
30                 valueFromBits(BitPatterns::aQuietNaN), &exponent)));
31   EXPECT_EQ(BitPatterns::aNegativeQuietNaN,
32             valueAsBits(__llvm_libc::frexpf(
33                 valueFromBits(BitPatterns::aNegativeQuietNaN), &exponent)));
34 
35   EXPECT_EQ(BitPatterns::aSignallingNaN,
36             valueAsBits(__llvm_libc::frexpf(
37                 valueFromBits(BitPatterns::aSignallingNaN), &exponent)));
38   EXPECT_EQ(
39       BitPatterns::aNegativeSignallingNaN,
40       valueAsBits(__llvm_libc::frexpf(
41           valueFromBits(BitPatterns::aNegativeSignallingNaN), &exponent)));
42 
43   EXPECT_EQ(BitPatterns::inf, valueAsBits(__llvm_libc::frexpf(
44                                   valueFromBits(BitPatterns::inf), &exponent)));
45   EXPECT_EQ(BitPatterns::negInf,
46             valueAsBits(__llvm_libc::frexpf(valueFromBits(BitPatterns::negInf),
47                                             &exponent)));
48 
49   EXPECT_EQ(BitPatterns::zero,
50             valueAsBits(__llvm_libc::frexpf(valueFromBits(BitPatterns::zero),
51                                             &exponent)));
52   EXPECT_EQ(exponent, 0);
53   EXPECT_EQ(BitPatterns::negZero,
54             valueAsBits(__llvm_libc::frexpf(valueFromBits(BitPatterns::negZero),
55                                             &exponent)));
56   EXPECT_EQ(exponent, 0);
57 }
58 
59 TEST(FrexpfTest, PowersOfTwo) {
60   int exponent;
61 
62   EXPECT_EQ(valueAsBits(0.5f),
63             valueAsBits(__llvm_libc::frexpf(1.0f, &exponent)));
64   EXPECT_EQ(exponent, 1);
65   EXPECT_EQ(valueAsBits(-0.5f),
66             valueAsBits(__llvm_libc::frexpf(-1.0f, &exponent)));
67   EXPECT_EQ(exponent, 1);
68 
69   EXPECT_EQ(valueAsBits(0.5f),
70             valueAsBits(__llvm_libc::frexpf(2.0f, &exponent)));
71   EXPECT_EQ(exponent, 2);
72   EXPECT_EQ(valueAsBits(-0.5f),
73             valueAsBits(__llvm_libc::frexpf(-2.0f, &exponent)));
74   EXPECT_EQ(exponent, 2);
75 
76   EXPECT_EQ(valueAsBits(0.5f),
77             valueAsBits(__llvm_libc::frexpf(4.0f, &exponent)));
78   EXPECT_EQ(exponent, 3);
79   EXPECT_EQ(valueAsBits(-0.5f),
80             valueAsBits(__llvm_libc::frexpf(-4.0f, &exponent)));
81   EXPECT_EQ(exponent, 3);
82 
83   EXPECT_EQ(valueAsBits(0.5f),
84             valueAsBits(__llvm_libc::frexpf(8.0f, &exponent)));
85   EXPECT_EQ(exponent, 4);
86   EXPECT_EQ(valueAsBits(-0.5f),
87             valueAsBits(__llvm_libc::frexpf(-8.0f, &exponent)));
88   EXPECT_EQ(exponent, 4);
89 
90   EXPECT_EQ(valueAsBits(0.5f),
91             valueAsBits(__llvm_libc::frexpf(16.0f, &exponent)));
92   EXPECT_EQ(exponent, 5);
93   EXPECT_EQ(valueAsBits(-0.5f),
94             valueAsBits(__llvm_libc::frexpf(-16.0f, &exponent)));
95   EXPECT_EQ(exponent, 5);
96 
97   EXPECT_EQ(valueAsBits(0.5f),
98             valueAsBits(__llvm_libc::frexpf(32.0f, &exponent)));
99   EXPECT_EQ(exponent, 6);
100   EXPECT_EQ(valueAsBits(-0.5f),
101             valueAsBits(__llvm_libc::frexpf(-32.0f, &exponent)));
102   EXPECT_EQ(exponent, 6);
103 
104   EXPECT_EQ(valueAsBits(0.5f),
105             valueAsBits(__llvm_libc::frexpf(64.0f, &exponent)));
106   EXPECT_EQ(exponent, 7);
107   EXPECT_EQ(valueAsBits(-0.5f),
108             valueAsBits(__llvm_libc::frexpf(-64.0f, &exponent)));
109   EXPECT_EQ(exponent, 7);
110 }
111 
112 TEST(FrexpTest, SomeIntegers) {
113   int exponent;
114 
115   EXPECT_EQ(valueAsBits(0.75f),
116             valueAsBits(__llvm_libc::frexpf(24.0f, &exponent)));
117   EXPECT_EQ(exponent, 5);
118   EXPECT_EQ(valueAsBits(-0.75f),
119             valueAsBits(__llvm_libc::frexpf(-24.0f, &exponent)));
120   EXPECT_EQ(exponent, 5);
121 
122   EXPECT_EQ(valueAsBits(0.625f),
123             valueAsBits(__llvm_libc::frexpf(40.0f, &exponent)));
124   EXPECT_EQ(exponent, 6);
125   EXPECT_EQ(valueAsBits(-0.625f),
126             valueAsBits(__llvm_libc::frexpf(-40.0f, &exponent)));
127   EXPECT_EQ(exponent, 6);
128 
129   EXPECT_EQ(valueAsBits(0.78125f),
130             valueAsBits(__llvm_libc::frexpf(800.0f, &exponent)));
131   EXPECT_EQ(exponent, 10);
132   EXPECT_EQ(valueAsBits(-0.78125f),
133             valueAsBits(__llvm_libc::frexpf(-800.0f, &exponent)));
134   EXPECT_EQ(exponent, 10);
135 }
136 
137 TEST(FrexpfTest, InFloatRange) {
138   using BitsType = Properties::BitsType;
139   constexpr BitsType count = 1000000;
140   constexpr BitsType step = UINT32_MAX / count;
141   for (BitsType i = 0, v = 0; i <= count; ++i, v += step) {
142     float x = valueFromBits(v);
143     if (isnan(x) || isinf(x) || x == 0.0)
144       continue;
145     int exponent;
146     float frac = __llvm_libc::frexpf(x, &exponent);
147 
148     ASSERT_TRUE(__llvm_libc::fputil::abs(frac) < 1.0f);
149     ASSERT_TRUE(__llvm_libc::fputil::abs(frac) >= 0.5f);
150   }
151 }
152