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