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