1118c13c6SSiva Chandra Reddy //===-- Unittests for modfff 2118c13c6SSiva Chandra Reddy //-----------------------------------------------===// 3118c13c6SSiva Chandra Reddy // 4118c13c6SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5118c13c6SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information. 6118c13c6SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7118c13c6SSiva Chandra Reddy // 8118c13c6SSiva Chandra Reddy //===----------------------------------------------------------------------===// 9118c13c6SSiva Chandra Reddy 10118c13c6SSiva Chandra Reddy #include "include/math.h" 11118c13c6SSiva Chandra Reddy #include "src/math/modff.h" 12*6fb7f3a3SSiva Chandra Reddy #include "utils/FPUtil/BasicOperations.h" 13118c13c6SSiva Chandra Reddy #include "utils/FPUtil/BitPatterns.h" 14118c13c6SSiva Chandra Reddy #include "utils/FPUtil/FloatOperations.h" 15118c13c6SSiva Chandra Reddy #include "utils/FPUtil/FloatProperties.h" 16*6fb7f3a3SSiva Chandra Reddy #include "utils/FPUtil/NearestIntegerOperations.h" 17118c13c6SSiva Chandra Reddy #include "utils/UnitTest/Test.h" 18118c13c6SSiva Chandra Reddy 19118c13c6SSiva Chandra Reddy using __llvm_libc::fputil::valueAsBits; 20118c13c6SSiva Chandra Reddy using __llvm_libc::fputil::valueFromBits; 21118c13c6SSiva Chandra Reddy 22118c13c6SSiva Chandra Reddy using BitPatterns = __llvm_libc::fputil::BitPatterns<float>; 23118c13c6SSiva Chandra Reddy using Properties = __llvm_libc::fputil::FloatProperties<float>; 24118c13c6SSiva Chandra Reddy 25118c13c6SSiva Chandra Reddy TEST(ModffTest, SpecialNumbers) { 26118c13c6SSiva Chandra Reddy float integral; 27118c13c6SSiva Chandra Reddy 28118c13c6SSiva Chandra Reddy EXPECT_EQ(BitPatterns::aQuietNaN, 29118c13c6SSiva Chandra Reddy valueAsBits(__llvm_libc::modff( 30118c13c6SSiva Chandra Reddy valueFromBits(BitPatterns::aQuietNaN), &integral))); 31118c13c6SSiva Chandra Reddy EXPECT_EQ(BitPatterns::aNegativeQuietNaN, 32118c13c6SSiva Chandra Reddy valueAsBits(__llvm_libc::modff( 33118c13c6SSiva Chandra Reddy valueFromBits(BitPatterns::aNegativeQuietNaN), &integral))); 34118c13c6SSiva Chandra Reddy 35118c13c6SSiva Chandra Reddy EXPECT_EQ(BitPatterns::aSignallingNaN, 36118c13c6SSiva Chandra Reddy valueAsBits(__llvm_libc::modff( 37118c13c6SSiva Chandra Reddy valueFromBits(BitPatterns::aSignallingNaN), &integral))); 38118c13c6SSiva Chandra Reddy EXPECT_EQ( 39118c13c6SSiva Chandra Reddy BitPatterns::aNegativeSignallingNaN, 40118c13c6SSiva Chandra Reddy valueAsBits(__llvm_libc::modff( 41118c13c6SSiva Chandra Reddy valueFromBits(BitPatterns::aNegativeSignallingNaN), &integral))); 42118c13c6SSiva Chandra Reddy 43118c13c6SSiva Chandra Reddy EXPECT_EQ(BitPatterns::zero, 44118c13c6SSiva Chandra Reddy valueAsBits(__llvm_libc::modff(valueFromBits(BitPatterns::inf), 45118c13c6SSiva Chandra Reddy &integral))); 46118c13c6SSiva Chandra Reddy EXPECT_EQ(valueAsBits(integral), BitPatterns::inf); 47118c13c6SSiva Chandra Reddy 48118c13c6SSiva Chandra Reddy EXPECT_EQ(BitPatterns::negZero, 49118c13c6SSiva Chandra Reddy valueAsBits(__llvm_libc::modff(valueFromBits(BitPatterns::negInf), 50118c13c6SSiva Chandra Reddy &integral))); 51118c13c6SSiva Chandra Reddy EXPECT_EQ(valueAsBits(integral), BitPatterns::negInf); 52118c13c6SSiva Chandra Reddy 53118c13c6SSiva Chandra Reddy EXPECT_EQ(BitPatterns::zero, 54118c13c6SSiva Chandra Reddy valueAsBits(__llvm_libc::modff(valueFromBits(BitPatterns::zero), 55118c13c6SSiva Chandra Reddy &integral))); 56118c13c6SSiva Chandra Reddy EXPECT_EQ(valueAsBits(integral), BitPatterns::zero); 57118c13c6SSiva Chandra Reddy 58118c13c6SSiva Chandra Reddy EXPECT_EQ(BitPatterns::negZero, 59118c13c6SSiva Chandra Reddy valueAsBits(__llvm_libc::modff(valueFromBits(BitPatterns::negZero), 60118c13c6SSiva Chandra Reddy &integral))); 61118c13c6SSiva Chandra Reddy EXPECT_EQ(valueAsBits(integral), BitPatterns::negZero); 62118c13c6SSiva Chandra Reddy } 63118c13c6SSiva Chandra Reddy 64118c13c6SSiva Chandra Reddy TEST(ModffTest, Integers) { 65118c13c6SSiva Chandra Reddy float integral; 66118c13c6SSiva Chandra Reddy 67118c13c6SSiva Chandra Reddy EXPECT_EQ(BitPatterns::zero, 68118c13c6SSiva Chandra Reddy valueAsBits(__llvm_libc::modff(1.0f, &integral))); 69118c13c6SSiva Chandra Reddy EXPECT_EQ(valueAsBits(integral), valueAsBits(1.0f)); 70118c13c6SSiva Chandra Reddy 71118c13c6SSiva Chandra Reddy EXPECT_EQ(BitPatterns::negZero, 72118c13c6SSiva Chandra Reddy valueAsBits(__llvm_libc::modff(-1.0f, &integral))); 73118c13c6SSiva Chandra Reddy EXPECT_EQ(valueAsBits(integral), valueAsBits(-1.0f)); 74118c13c6SSiva Chandra Reddy 75118c13c6SSiva Chandra Reddy EXPECT_EQ(BitPatterns::zero, 76118c13c6SSiva Chandra Reddy valueAsBits(__llvm_libc::modff(10.0f, &integral))); 77118c13c6SSiva Chandra Reddy EXPECT_EQ(valueAsBits(integral), valueAsBits(10.0f)); 78118c13c6SSiva Chandra Reddy 79118c13c6SSiva Chandra Reddy EXPECT_EQ(BitPatterns::negZero, 80118c13c6SSiva Chandra Reddy valueAsBits(__llvm_libc::modff(-10.0f, &integral))); 81118c13c6SSiva Chandra Reddy EXPECT_EQ(valueAsBits(integral), valueAsBits(-10.0f)); 82118c13c6SSiva Chandra Reddy 83118c13c6SSiva Chandra Reddy EXPECT_EQ(BitPatterns::zero, 84118c13c6SSiva Chandra Reddy valueAsBits(__llvm_libc::modff(12345.0f, &integral))); 85118c13c6SSiva Chandra Reddy EXPECT_EQ(valueAsBits(integral), valueAsBits(12345.0f)); 86118c13c6SSiva Chandra Reddy 87118c13c6SSiva Chandra Reddy EXPECT_EQ(BitPatterns::negZero, 88118c13c6SSiva Chandra Reddy valueAsBits(__llvm_libc::modff(-12345.0f, &integral))); 89118c13c6SSiva Chandra Reddy EXPECT_EQ(valueAsBits(integral), valueAsBits(-12345.0f)); 90118c13c6SSiva Chandra Reddy } 91118c13c6SSiva Chandra Reddy 92118c13c6SSiva Chandra Reddy TEST(ModfTest, Fractions) { 93118c13c6SSiva Chandra Reddy float integral; 94118c13c6SSiva Chandra Reddy 95118c13c6SSiva Chandra Reddy EXPECT_EQ(valueAsBits(0.5f), 96118c13c6SSiva Chandra Reddy valueAsBits(__llvm_libc::modff(1.5f, &integral))); 97118c13c6SSiva Chandra Reddy EXPECT_EQ(valueAsBits(integral), valueAsBits(1.0f)); 98118c13c6SSiva Chandra Reddy 99118c13c6SSiva Chandra Reddy EXPECT_EQ(valueAsBits(-0.5f), 100118c13c6SSiva Chandra Reddy valueAsBits(__llvm_libc::modff(-1.5f, &integral))); 101118c13c6SSiva Chandra Reddy EXPECT_EQ(valueAsBits(integral), valueAsBits(-1.0f)); 102118c13c6SSiva Chandra Reddy 103118c13c6SSiva Chandra Reddy EXPECT_EQ(valueAsBits(0.75f), 104118c13c6SSiva Chandra Reddy valueAsBits(__llvm_libc::modff(10.75f, &integral))); 105118c13c6SSiva Chandra Reddy EXPECT_EQ(valueAsBits(integral), valueAsBits(10.0f)); 106118c13c6SSiva Chandra Reddy 107118c13c6SSiva Chandra Reddy EXPECT_EQ(valueAsBits(-0.75f), 108118c13c6SSiva Chandra Reddy valueAsBits(__llvm_libc::modff(-10.75f, &integral))); 109118c13c6SSiva Chandra Reddy EXPECT_EQ(valueAsBits(integral), valueAsBits(-10.0f)); 110118c13c6SSiva Chandra Reddy 111118c13c6SSiva Chandra Reddy EXPECT_EQ(valueAsBits(0.125f), 112118c13c6SSiva Chandra Reddy valueAsBits(__llvm_libc::modff(100.125f, &integral))); 113118c13c6SSiva Chandra Reddy EXPECT_EQ(valueAsBits(integral), valueAsBits(100.0f)); 114118c13c6SSiva Chandra Reddy 115118c13c6SSiva Chandra Reddy EXPECT_EQ(valueAsBits(-0.125f), 116118c13c6SSiva Chandra Reddy valueAsBits(__llvm_libc::modff(-100.125f, &integral))); 117118c13c6SSiva Chandra Reddy EXPECT_EQ(valueAsBits(integral), valueAsBits(-100.0f)); 118118c13c6SSiva Chandra Reddy } 119118c13c6SSiva Chandra Reddy 120118c13c6SSiva Chandra Reddy TEST(ModffTest, InDoubleRange) { 121118c13c6SSiva Chandra Reddy using BitsType = Properties::BitsType; 122118c13c6SSiva Chandra Reddy constexpr BitsType count = 10000000; 123118c13c6SSiva Chandra Reddy constexpr BitsType step = UINT32_MAX / count; 124118c13c6SSiva Chandra Reddy for (BitsType i = 0, v = 0; i <= count; ++i, v += step) { 125118c13c6SSiva Chandra Reddy float x = valueFromBits(v); 126118c13c6SSiva Chandra Reddy if (isnan(x) || isinf(x) || x == 0.0f) { 127118c13c6SSiva Chandra Reddy // These conditions have been tested in other tests. 128118c13c6SSiva Chandra Reddy continue; 129118c13c6SSiva Chandra Reddy } 130118c13c6SSiva Chandra Reddy 131118c13c6SSiva Chandra Reddy float integral; 132118c13c6SSiva Chandra Reddy float frac = __llvm_libc::modff(x, &integral); 133118c13c6SSiva Chandra Reddy ASSERT_TRUE(__llvm_libc::fputil::abs(frac) < 1.0f); 134118c13c6SSiva Chandra Reddy ASSERT_TRUE(__llvm_libc::fputil::trunc(x) == integral); 135118c13c6SSiva Chandra Reddy ASSERT_TRUE(integral + frac == x); 136118c13c6SSiva Chandra Reddy } 137118c13c6SSiva Chandra Reddy } 138