1 //===-- Unittests for frexpl ----------------------------------------------===// 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/frexpl.h" 10 #include "utils/FPUtil/BasicOperations.h" 11 #include "utils/FPUtil/FPBits.h" 12 #include "utils/MPFRWrapper/MPFRUtils.h" 13 #include "utils/UnitTest/Test.h" 14 #include <math.h> 15 16 typedef long double LD; 17 using FPBits = __llvm_libc::fputil::FPBits<long double>; 18 19 namespace mpfr = __llvm_libc::testing::mpfr; 20 21 TEST(LlvmLibcFrexplTest, SpecialNumbers) { 22 int exponent; 23 24 EXPECT_TRUE(LD(FPBits::inf()) == 25 __llvm_libc::frexpl(LD(FPBits::inf()), &exponent)); 26 EXPECT_TRUE(LD(FPBits::negInf()) == 27 __llvm_libc::frexpl(LD(FPBits::negInf()), &exponent)); 28 29 EXPECT_TRUE(LD(FPBits::zero()) == 30 __llvm_libc::frexpl(LD(FPBits::zero()), &exponent)); 31 EXPECT_EQ(exponent, 0); 32 33 EXPECT_TRUE(LD(FPBits::negZero()) == 34 __llvm_libc::frexpl(LD(FPBits::negZero()), &exponent)); 35 EXPECT_EQ(exponent, 0); 36 37 EXPECT_TRUE( 38 FPBits(__llvm_libc::frexpl(LD(FPBits::buildNaN(1)), &exponent)).isNaN()); 39 } 40 41 TEST(LlvmLibcFrexplTest, PowersOfTwo) { 42 int exponent; 43 44 EXPECT_TRUE(0.5l == __llvm_libc::frexpl(1.0l, &exponent)); 45 EXPECT_EQ(exponent, 1); 46 EXPECT_TRUE(-0.5l == __llvm_libc::frexpl(-1.0l, &exponent)); 47 EXPECT_EQ(exponent, 1); 48 49 EXPECT_TRUE(0.5l == __llvm_libc::frexpl(2.0l, &exponent)); 50 EXPECT_EQ(exponent, 2); 51 EXPECT_TRUE(-0.5l == __llvm_libc::frexpl(-2.0l, &exponent)); 52 EXPECT_EQ(exponent, 2); 53 54 EXPECT_TRUE(0.5l == __llvm_libc::frexpl(4.0l, &exponent)); 55 EXPECT_EQ(exponent, 3); 56 EXPECT_TRUE(-0.5l == __llvm_libc::frexpl(-4.0l, &exponent)); 57 EXPECT_EQ(exponent, 3); 58 59 EXPECT_TRUE(0.5l == __llvm_libc::frexpl(8.0l, &exponent)); 60 EXPECT_EQ(exponent, 4); 61 EXPECT_TRUE(-0.5l == __llvm_libc::frexpl(-8.0l, &exponent)); 62 EXPECT_EQ(exponent, 4); 63 64 EXPECT_TRUE(0.5l == __llvm_libc::frexpl(16.0l, &exponent)); 65 EXPECT_EQ(exponent, 5); 66 EXPECT_TRUE(-0.5l == __llvm_libc::frexpl(-16.0l, &exponent)); 67 EXPECT_EQ(exponent, 5); 68 69 EXPECT_TRUE(0.5l == __llvm_libc::frexpl(32.0l, &exponent)); 70 EXPECT_EQ(exponent, 6); 71 EXPECT_TRUE(-0.5l == __llvm_libc::frexpl(-32.0l, &exponent)); 72 EXPECT_EQ(exponent, 6); 73 } 74 75 TEST(LlvmLibcFrexplTest, SomeIntegers) { 76 int exponent; 77 78 EXPECT_TRUE(0.75l == __llvm_libc::frexpl(24.0l, &exponent)); 79 EXPECT_EQ(exponent, 5); 80 EXPECT_TRUE(-0.75l == __llvm_libc::frexpl(-24.0l, &exponent)); 81 EXPECT_EQ(exponent, 5); 82 83 EXPECT_TRUE(0.625l == __llvm_libc::frexpl(40.0l, &exponent)); 84 EXPECT_EQ(exponent, 6); 85 EXPECT_TRUE(-0.625l == __llvm_libc::frexpl(-40.0l, &exponent)); 86 EXPECT_EQ(exponent, 6); 87 88 EXPECT_TRUE(0.78125l == __llvm_libc::frexpl(800.0l, &exponent)); 89 EXPECT_EQ(exponent, 10); 90 EXPECT_TRUE(-0.78125l == __llvm_libc::frexpl(-800.0l, &exponent)); 91 EXPECT_EQ(exponent, 10); 92 } 93 94 TEST(LlvmLibcFrexplTest, LongDoubleRange) { 95 using UIntType = FPBits::UIntType; 96 constexpr UIntType count = 10000000; 97 constexpr UIntType step = UIntType(-1) / count; 98 for (UIntType i = 0, v = 0; i <= count; ++i, v += step) { 99 long double x = static_cast<long double>(FPBits(v)); 100 if (isnan(x) || isinf(x) || x == 0.0l) 101 continue; 102 103 mpfr::BinaryOutput<long double> result; 104 result.f = __llvm_libc::frexpl(x, &result.i); 105 106 ASSERT_TRUE(__llvm_libc::fputil::abs(result.f) < 1.0); 107 ASSERT_TRUE(__llvm_libc::fputil::abs(result.f) >= 0.5); 108 ASSERT_MPFR_MATCH(mpfr::Operation::Frexp, x, result, 0.0); 109 } 110 } 111