1 //===-- Unittests for logbf -----------------------------------------------===//
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 "src/math/logbf.h"
10 #include "utils/FPUtil/BitPatterns.h"
11 #include "utils/FPUtil/FloatOperations.h"
12 #include "utils/FPUtil/FloatProperties.h"
13 #include "utils/FPUtil/ManipulationFunctions.h"
14 #include "utils/UnitTest/Test.h"
15 #include <math.h>
16 
17 using __llvm_libc::fputil::valueAsBits;
18 using __llvm_libc::fputil::valueFromBits;
19 
20 using BitPatterns = __llvm_libc::fputil::BitPatterns<float>;
21 using Properties = __llvm_libc::fputil::FloatProperties<float>;
22 
23 TEST(LlvmLibcLogbfTest, SpecialNumbers) {
24   EXPECT_EQ(
25       BitPatterns::aQuietNaN,
26       valueAsBits(__llvm_libc::logbf(valueFromBits(BitPatterns::aQuietNaN))));
27   EXPECT_EQ(BitPatterns::aNegativeQuietNaN,
28             valueAsBits(__llvm_libc::logbf(
29                 valueFromBits(BitPatterns::aNegativeQuietNaN))));
30 
31   EXPECT_EQ(BitPatterns::aSignallingNaN,
32             valueAsBits(__llvm_libc::logbf(
33                 valueFromBits(BitPatterns::aSignallingNaN))));
34   EXPECT_EQ(BitPatterns::aNegativeSignallingNaN,
35             valueAsBits(__llvm_libc::logbf(
36                 valueFromBits(BitPatterns::aNegativeSignallingNaN))));
37 
38   EXPECT_EQ(BitPatterns::inf,
39             valueAsBits(__llvm_libc::logbf(valueFromBits(BitPatterns::inf))));
40   EXPECT_EQ(BitPatterns::inf, valueAsBits(__llvm_libc::logbf(
41                                   valueFromBits(BitPatterns::negInf))));
42 
43   EXPECT_EQ(BitPatterns::negInf,
44             valueAsBits(__llvm_libc::logbf(valueFromBits(BitPatterns::zero))));
45   EXPECT_EQ(BitPatterns::negInf, valueAsBits(__llvm_libc::logbf(
46                                      valueFromBits(BitPatterns::negZero))));
47 }
48 
49 TEST(LlvmLibcLogbfTest, PowersOfTwo) {
50   EXPECT_EQ(valueAsBits(0.0f), valueAsBits(__llvm_libc::logbf(1.0f)));
51   EXPECT_EQ(valueAsBits(0.0f), valueAsBits(__llvm_libc::logbf(-1.0f)));
52 
53   EXPECT_EQ(valueAsBits(1.0f), valueAsBits(__llvm_libc::logbf(2.0f)));
54   EXPECT_EQ(valueAsBits(1.0f), valueAsBits(__llvm_libc::logbf(-2.0f)));
55 
56   EXPECT_EQ(valueAsBits(2.0f), valueAsBits(__llvm_libc::logbf(4.0f)));
57   EXPECT_EQ(valueAsBits(2.0f), valueAsBits(__llvm_libc::logbf(-4.0f)));
58 
59   EXPECT_EQ(valueAsBits(3.0f), valueAsBits(__llvm_libc::logbf(8.0f)));
60   EXPECT_EQ(valueAsBits(3.0f), valueAsBits(__llvm_libc::logbf(-8.0f)));
61 
62   EXPECT_EQ(valueAsBits(4.0f), valueAsBits(__llvm_libc::logbf(16.0f)));
63   EXPECT_EQ(valueAsBits(4.0f), valueAsBits(__llvm_libc::logbf(-16.0f)));
64 
65   EXPECT_EQ(valueAsBits(5.0f), valueAsBits(__llvm_libc::logbf(32.0f)));
66   EXPECT_EQ(valueAsBits(5.0f), valueAsBits(__llvm_libc::logbf(-32.0f)));
67 }
68 
69 TEST(LlvmLibcLogbTest, SomeIntegers) {
70   EXPECT_EQ(valueAsBits(1.0f), valueAsBits(__llvm_libc::logbf(3.0f)));
71   EXPECT_EQ(valueAsBits(1.0f), valueAsBits(__llvm_libc::logbf(-3.0f)));
72 
73   EXPECT_EQ(valueAsBits(2.0f), valueAsBits(__llvm_libc::logbf(7.0f)));
74   EXPECT_EQ(valueAsBits(2.0f), valueAsBits(__llvm_libc::logbf(-7.0f)));
75 
76   EXPECT_EQ(valueAsBits(3.0f), valueAsBits(__llvm_libc::logbf(10.0f)));
77   EXPECT_EQ(valueAsBits(3.0f), valueAsBits(__llvm_libc::logbf(-10.0f)));
78 
79   EXPECT_EQ(valueAsBits(4.0f), valueAsBits(__llvm_libc::logbf(31.0f)));
80   EXPECT_EQ(valueAsBits(4.0f), valueAsBits(__llvm_libc::logbf(-31.0f)));
81 
82   EXPECT_EQ(valueAsBits(5.0f), valueAsBits(__llvm_libc::logbf(55.0f)));
83   EXPECT_EQ(valueAsBits(5.0f), valueAsBits(__llvm_libc::logbf(-55.0f)));
84 }
85 
86 TEST(LlvmLibcLogbfTest, InDoubleRange) {
87   using BitsType = Properties::BitsType;
88   constexpr BitsType count = 10000000;
89   constexpr BitsType step = UINT32_MAX / count;
90   for (BitsType i = 0, v = 0; i <= count; ++i, v += step) {
91     float x = valueFromBits(v);
92     if (isnan(x) || isinf(x) || x == 0.0)
93       continue;
94 
95     int exponent;
96     __llvm_libc::fputil::frexp(x, exponent);
97     ASSERT_TRUE(float(exponent) == __llvm_libc::logbf(x) + 1.0);
98   }
99 }
100