1e7e71e94SSiva Chandra Reddy //===-- Utility class to test floor[f|l] ------------------------*- C++ -*-===// 2e7e71e94SSiva Chandra Reddy // 3e7e71e94SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e7e71e94SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information. 5e7e71e94SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e7e71e94SSiva Chandra Reddy // 7e7e71e94SSiva Chandra Reddy //===----------------------------------------------------------------------===// 8e7e71e94SSiva Chandra Reddy 9c120edc7SMichael Jones #include "src/__support/FPUtil/BasicOperations.h" 10c120edc7SMichael Jones #include "src/__support/FPUtil/NearestIntegerOperations.h" 11e7e71e94SSiva Chandra Reddy #include "utils/MPFRWrapper/MPFRUtils.h" 126c3f53c7SSiva Chandra Reddy #include "utils/UnitTest/FPMatcher.h" 13e7e71e94SSiva Chandra Reddy #include "utils/UnitTest/Test.h" 14e7e71e94SSiva Chandra Reddy 15e7e71e94SSiva Chandra Reddy #include <math.h> 16e7e71e94SSiva Chandra Reddy 17e7e71e94SSiva Chandra Reddy namespace mpfr = __llvm_libc::testing::mpfr; 18e7e71e94SSiva Chandra Reddy 19e7e71e94SSiva Chandra Reddy template <typename T> class ModfTest : public __llvm_libc::testing::Test { 20e7e71e94SSiva Chandra Reddy 21e7e71e94SSiva Chandra Reddy DECLARE_SPECIAL_CONSTANTS(T) 22e7e71e94SSiva Chandra Reddy 23e7e71e94SSiva Chandra Reddy public: 24e7e71e94SSiva Chandra Reddy typedef T (*ModfFunc)(T, T *); 25e7e71e94SSiva Chandra Reddy testSpecialNumbers(ModfFunc func)26e7e71e94SSiva Chandra Reddy void testSpecialNumbers(ModfFunc func) { 27e7e71e94SSiva Chandra Reddy T integral; 28e7e71e94SSiva Chandra Reddy 29e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(zero, func(zero, &integral)); 30e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(integral, zero); 311c92911eSMichael Jones EXPECT_FP_EQ(neg_zero, func(neg_zero, &integral)); 321c92911eSMichael Jones EXPECT_FP_EQ(integral, neg_zero); 33e7e71e94SSiva Chandra Reddy 34e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(zero, func(inf, &integral)); 35e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(inf, integral); 361c92911eSMichael Jones EXPECT_FP_EQ(neg_zero, func(neg_inf, &integral)); 371c92911eSMichael Jones EXPECT_FP_EQ(neg_inf, integral); 38e7e71e94SSiva Chandra Reddy 39e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(aNaN, func(aNaN, &integral)); 40e7e71e94SSiva Chandra Reddy } 41e7e71e94SSiva Chandra Reddy testIntegers(ModfFunc func)42e7e71e94SSiva Chandra Reddy void testIntegers(ModfFunc func) { 43e7e71e94SSiva Chandra Reddy T integral; 44e7e71e94SSiva Chandra Reddy 45e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(0.0), func(T(1.0), &integral)); 46e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(1.0), integral); 47e7e71e94SSiva Chandra Reddy 48e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(-0.0), func(T(-1.0), &integral)); 49e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(-1.0), integral); 50e7e71e94SSiva Chandra Reddy 51e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(0.0), func(T(10.0), &integral)); 52e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(10.0), integral); 53e7e71e94SSiva Chandra Reddy 54e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(-0.0), func(T(-10.0), &integral)); 55e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(-10.0), integral); 56e7e71e94SSiva Chandra Reddy 57e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(0.0), func(T(12345.0), &integral)); 58e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(12345.0), integral); 59e7e71e94SSiva Chandra Reddy 60e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(-0.0), func(T(-12345.0), &integral)); 61e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(-12345.0), integral); 62e7e71e94SSiva Chandra Reddy } 63e7e71e94SSiva Chandra Reddy testFractions(ModfFunc func)64e7e71e94SSiva Chandra Reddy void testFractions(ModfFunc func) { 65e7e71e94SSiva Chandra Reddy T integral; 66e7e71e94SSiva Chandra Reddy 67e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(0.5), func(T(1.5), &integral)); 68e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(integral, T(1.0)); 69e7e71e94SSiva Chandra Reddy 70e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(-0.5), func(T(-1.5), &integral)); 71e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(integral, T(-1.0)); 72e7e71e94SSiva Chandra Reddy 73e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(0.75), func(T(10.75), &integral)); 74e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(integral, T(10.0)); 75e7e71e94SSiva Chandra Reddy 76e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(-0.75), func(T(-10.75), &integral)); 77e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(integral, T(-10.0)); 78e7e71e94SSiva Chandra Reddy 79e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(0.125), func(T(100.125), &integral)); 80e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(integral, T(100.0)); 81e7e71e94SSiva Chandra Reddy 82e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(-0.125), func(T(-100.125), &integral)); 83e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(integral, T(-100.0)); 84e7e71e94SSiva Chandra Reddy } 85e7e71e94SSiva Chandra Reddy testRange(ModfFunc func)86e7e71e94SSiva Chandra Reddy void testRange(ModfFunc func) { 87*25226f3eSMichael Jones constexpr UIntType COUNT = 10000000; 88*25226f3eSMichael Jones constexpr UIntType STEP = UIntType(-1) / COUNT; 89*25226f3eSMichael Jones for (UIntType i = 0, v = 0; i <= COUNT; ++i, v += STEP) { 90e7e71e94SSiva Chandra Reddy T x = T(FPBits(v)); 91e7e71e94SSiva Chandra Reddy if (isnan(x) || isinf(x) || x == T(0.0)) 92e7e71e94SSiva Chandra Reddy continue; 93e7e71e94SSiva Chandra Reddy 94e7e71e94SSiva Chandra Reddy T integral; 95e7e71e94SSiva Chandra Reddy T frac = func(x, &integral); 96e7e71e94SSiva Chandra Reddy ASSERT_TRUE(__llvm_libc::fputil::abs(frac) < 1.0l); 97e7e71e94SSiva Chandra Reddy ASSERT_TRUE(__llvm_libc::fputil::trunc(x) == integral); 98e7e71e94SSiva Chandra Reddy ASSERT_TRUE(integral + frac == x); 99e7e71e94SSiva Chandra Reddy } 100e7e71e94SSiva Chandra Reddy } 101e7e71e94SSiva Chandra Reddy }; 102e7e71e94SSiva Chandra Reddy 103e7e71e94SSiva Chandra Reddy #define LIST_MODF_TESTS(T, func) \ 104e7e71e94SSiva Chandra Reddy using LlvmLibcModfTest = ModfTest<T>; \ 105e7e71e94SSiva Chandra Reddy TEST_F(LlvmLibcModfTest, SpecialNumbers) { testSpecialNumbers(&func); } \ 106e7e71e94SSiva Chandra Reddy TEST_F(LlvmLibcModfTest, RoundedNubmers) { testIntegers(&func); } \ 107e7e71e94SSiva Chandra Reddy TEST_F(LlvmLibcModfTest, Fractions) { testFractions(&func); } \ 108e7e71e94SSiva Chandra Reddy TEST_F(LlvmLibcModfTest, Range) { testRange(&func); } 109