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