1 //===-- Unittests for modf ------------------------------------------------===// 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/modf.h" 11 #include "utils/FPUtil/BasicOperations.h" 12 #include "utils/FPUtil/BitPatterns.h" 13 #include "utils/FPUtil/FloatOperations.h" 14 #include "utils/FPUtil/FloatProperties.h" 15 #include "utils/FPUtil/NearestIntegerOperations.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<double>; 22 using Properties = __llvm_libc::fputil::FloatProperties<double>; 23 24 TEST(ModfTest, SpecialNumbers) { 25 double integral; 26 27 EXPECT_EQ(BitPatterns::aQuietNaN, 28 valueAsBits(__llvm_libc::modf(valueFromBits(BitPatterns::aQuietNaN), 29 &integral))); 30 EXPECT_EQ(BitPatterns::aNegativeQuietNaN, 31 valueAsBits(__llvm_libc::modf( 32 valueFromBits(BitPatterns::aNegativeQuietNaN), &integral))); 33 34 EXPECT_EQ(BitPatterns::aSignallingNaN, 35 valueAsBits(__llvm_libc::modf( 36 valueFromBits(BitPatterns::aSignallingNaN), &integral))); 37 EXPECT_EQ( 38 BitPatterns::aNegativeSignallingNaN, 39 valueAsBits(__llvm_libc::modf( 40 valueFromBits(BitPatterns::aNegativeSignallingNaN), &integral))); 41 42 EXPECT_EQ(BitPatterns::zero, 43 valueAsBits( 44 __llvm_libc::modf(valueFromBits(BitPatterns::inf), &integral))); 45 EXPECT_EQ(valueAsBits(integral), BitPatterns::inf); 46 47 EXPECT_EQ(BitPatterns::negZero, 48 valueAsBits(__llvm_libc::modf(valueFromBits(BitPatterns::negInf), 49 &integral))); 50 EXPECT_EQ(valueAsBits(integral), BitPatterns::negInf); 51 52 EXPECT_EQ(BitPatterns::zero, 53 valueAsBits(__llvm_libc::modf(valueFromBits(BitPatterns::zero), 54 &integral))); 55 EXPECT_EQ(valueAsBits(integral), BitPatterns::zero); 56 57 EXPECT_EQ(BitPatterns::negZero, 58 valueAsBits(__llvm_libc::modf(valueFromBits(BitPatterns::negZero), 59 &integral))); 60 EXPECT_EQ(valueAsBits(integral), BitPatterns::negZero); 61 } 62 63 TEST(ModfTest, Integers) { 64 double integral; 65 66 EXPECT_EQ(BitPatterns::zero, valueAsBits(__llvm_libc::modf(1.0, &integral))); 67 EXPECT_EQ(valueAsBits(integral), valueAsBits(1.0)); 68 69 EXPECT_EQ(BitPatterns::negZero, 70 valueAsBits(__llvm_libc::modf(-1.0, &integral))); 71 EXPECT_EQ(valueAsBits(integral), valueAsBits(-1.0)); 72 73 EXPECT_EQ(BitPatterns::zero, valueAsBits(__llvm_libc::modf(10.0, &integral))); 74 EXPECT_EQ(valueAsBits(integral), valueAsBits(10.0)); 75 76 EXPECT_EQ(BitPatterns::negZero, 77 valueAsBits(__llvm_libc::modf(-10.0, &integral))); 78 EXPECT_EQ(valueAsBits(integral), valueAsBits(-10.0)); 79 80 EXPECT_EQ(BitPatterns::zero, 81 valueAsBits(__llvm_libc::modf(12345.0, &integral))); 82 EXPECT_EQ(valueAsBits(integral), valueAsBits(12345.0)); 83 84 EXPECT_EQ(BitPatterns::negZero, 85 valueAsBits(__llvm_libc::modf(-12345.0, &integral))); 86 EXPECT_EQ(valueAsBits(integral), valueAsBits(-12345.0)); 87 } 88 89 TEST(ModfTest, Fractions) { 90 double integral; 91 92 EXPECT_EQ(valueAsBits(0.5), valueAsBits(__llvm_libc::modf(1.5, &integral))); 93 EXPECT_EQ(valueAsBits(integral), valueAsBits(1.0)); 94 95 EXPECT_EQ(valueAsBits(-0.5), valueAsBits(__llvm_libc::modf(-1.5, &integral))); 96 EXPECT_EQ(valueAsBits(integral), valueAsBits(-1.0)); 97 98 EXPECT_EQ(valueAsBits(0.75), 99 valueAsBits(__llvm_libc::modf(10.75, &integral))); 100 EXPECT_EQ(valueAsBits(integral), valueAsBits(10.0)); 101 102 EXPECT_EQ(valueAsBits(-0.75), 103 valueAsBits(__llvm_libc::modf(-10.75, &integral))); 104 EXPECT_EQ(valueAsBits(integral), valueAsBits(-10.0)); 105 106 EXPECT_EQ(valueAsBits(0.125), 107 valueAsBits(__llvm_libc::modf(100.125, &integral))); 108 EXPECT_EQ(valueAsBits(integral), valueAsBits(100.0)); 109 110 EXPECT_EQ(valueAsBits(-0.125), 111 valueAsBits(__llvm_libc::modf(-100.125, &integral))); 112 EXPECT_EQ(valueAsBits(integral), valueAsBits(-100.0)); 113 } 114 115 TEST(ModfTest, InDoubleRange) { 116 using BitsType = Properties::BitsType; 117 constexpr BitsType count = 10000000; 118 constexpr BitsType step = UINT64_MAX / count; 119 for (BitsType i = 0, v = 0; i <= count; ++i, v += step) { 120 double x = valueFromBits(v); 121 if (isnan(x) || isinf(x) || x == 0.0) { 122 // These conditions have been tested in other tests. 123 continue; 124 } 125 126 double integral; 127 double frac = __llvm_libc::modf(x, &integral); 128 ASSERT_TRUE(__llvm_libc::fputil::abs(frac) < 1.0); 129 ASSERT_TRUE(__llvm_libc::fputil::trunc(x) == integral); 130 ASSERT_TRUE(integral + frac == x); 131 } 132 } 133