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" 11837dab96SRoland McGrath #include "test/UnitTest/FEnvSafeTest.h" 12af1315c2SSiva Chandra Reddy #include "test/UnitTest/FPMatcher.h" 13af1315c2SSiva Chandra Reddy #include "test/UnitTest/Test.h" 14e7e71e94SSiva Chandra Reddy #include "utils/MPFRWrapper/MPFRUtils.h" 15e7e71e94SSiva Chandra Reddy 165748ad84Slntue #include "hdr/math_macros.h" 17e7e71e94SSiva Chandra Reddy 18b6bc9d72SGuillaume Chatelet namespace mpfr = LIBC_NAMESPACE::testing::mpfr; 19e7e71e94SSiva Chandra Reddy 20837dab96SRoland McGrath template <typename T> 21837dab96SRoland McGrath class ModfTest : public LIBC_NAMESPACE::testing::FEnvSafeTest { 22e7e71e94SSiva Chandra Reddy 23e7e71e94SSiva Chandra Reddy DECLARE_SPECIAL_CONSTANTS(T) 24e7e71e94SSiva Chandra Reddy 25e7e71e94SSiva Chandra Reddy public: 26e7e71e94SSiva Chandra Reddy typedef T (*ModfFunc)(T, T *); 27e7e71e94SSiva Chandra Reddy 28e7e71e94SSiva Chandra Reddy void testSpecialNumbers(ModfFunc func) { 29e7e71e94SSiva Chandra Reddy T integral; 30e7e71e94SSiva Chandra Reddy 31e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(zero, func(zero, &integral)); 32e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(integral, zero); 331c92911eSMichael Jones EXPECT_FP_EQ(neg_zero, func(neg_zero, &integral)); 341c92911eSMichael Jones EXPECT_FP_EQ(integral, neg_zero); 35e7e71e94SSiva Chandra Reddy 36e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(zero, func(inf, &integral)); 37e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(inf, integral); 381c92911eSMichael Jones EXPECT_FP_EQ(neg_zero, func(neg_inf, &integral)); 391c92911eSMichael Jones EXPECT_FP_EQ(neg_inf, integral); 40e7e71e94SSiva Chandra Reddy 41e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(aNaN, func(aNaN, &integral)); 42e7e71e94SSiva Chandra Reddy } 43e7e71e94SSiva Chandra Reddy 44e7e71e94SSiva Chandra Reddy void testIntegers(ModfFunc func) { 45e7e71e94SSiva Chandra Reddy T integral; 46e7e71e94SSiva Chandra Reddy 47e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(0.0), func(T(1.0), &integral)); 48e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(1.0), integral); 49e7e71e94SSiva Chandra Reddy 50e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(-0.0), func(T(-1.0), &integral)); 51e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(-1.0), integral); 52e7e71e94SSiva Chandra Reddy 53e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(0.0), func(T(10.0), &integral)); 54e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(10.0), integral); 55e7e71e94SSiva Chandra Reddy 56e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(-0.0), func(T(-10.0), &integral)); 57e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(-10.0), integral); 58e7e71e94SSiva Chandra Reddy 59e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(0.0), func(T(12345.0), &integral)); 60e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(12345.0), integral); 61e7e71e94SSiva Chandra Reddy 62e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(-0.0), func(T(-12345.0), &integral)); 63e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(-12345.0), integral); 64e7e71e94SSiva Chandra Reddy } 65e7e71e94SSiva Chandra Reddy 66e7e71e94SSiva Chandra Reddy void testFractions(ModfFunc func) { 67e7e71e94SSiva Chandra Reddy T integral; 68e7e71e94SSiva Chandra Reddy 69e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(0.5), func(T(1.5), &integral)); 70e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(integral, T(1.0)); 71e7e71e94SSiva Chandra Reddy 72e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(-0.5), func(T(-1.5), &integral)); 73e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(integral, T(-1.0)); 74e7e71e94SSiva Chandra Reddy 75e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(0.75), func(T(10.75), &integral)); 76e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(integral, T(10.0)); 77e7e71e94SSiva Chandra Reddy 78e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(-0.75), func(T(-10.75), &integral)); 79e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(integral, T(-10.0)); 80e7e71e94SSiva Chandra Reddy 81e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(0.125), func(T(100.125), &integral)); 82e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(integral, T(100.0)); 83e7e71e94SSiva Chandra Reddy 84e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(T(-0.125), func(T(-100.125), &integral)); 85e7e71e94SSiva Chandra Reddy EXPECT_FP_EQ(integral, T(-100.0)); 86e7e71e94SSiva Chandra Reddy } 87e7e71e94SSiva Chandra Reddy 88e7e71e94SSiva Chandra Reddy void testRange(ModfFunc func) { 893546f4daSGuillaume Chatelet constexpr StorageType COUNT = 100'000; 9057fcc238SGuillaume Chatelet constexpr StorageType STEP = STORAGE_MAX / COUNT; 913546f4daSGuillaume Chatelet for (StorageType i = 0, v = 0; i <= COUNT; ++i, v += STEP) { 922856db0dSGuillaume Chatelet T x = FPBits(v).get_val(); 93*f8f5b175SNhat Nguyen if (FPBits(v).is_nan() || FPBits(v).is_inf() || x == T(0.0)) 94e7e71e94SSiva Chandra Reddy continue; 95e7e71e94SSiva Chandra Reddy 96e7e71e94SSiva Chandra Reddy T integral; 97e7e71e94SSiva Chandra Reddy T frac = func(x, &integral); 98b6bc9d72SGuillaume Chatelet ASSERT_TRUE(LIBC_NAMESPACE::fputil::abs(frac) < 1.0l); 99b6bc9d72SGuillaume Chatelet ASSERT_TRUE(LIBC_NAMESPACE::fputil::trunc(x) == integral); 100e7e71e94SSiva Chandra Reddy ASSERT_TRUE(integral + frac == x); 101e7e71e94SSiva Chandra Reddy } 102e7e71e94SSiva Chandra Reddy } 103e7e71e94SSiva Chandra Reddy }; 104e7e71e94SSiva Chandra Reddy 105e7e71e94SSiva Chandra Reddy #define LIST_MODF_TESTS(T, func) \ 106e7e71e94SSiva Chandra Reddy using LlvmLibcModfTest = ModfTest<T>; \ 107e7e71e94SSiva Chandra Reddy TEST_F(LlvmLibcModfTest, SpecialNumbers) { testSpecialNumbers(&func); } \ 108e7e71e94SSiva Chandra Reddy TEST_F(LlvmLibcModfTest, RoundedNubmers) { testIntegers(&func); } \ 109e7e71e94SSiva Chandra Reddy TEST_F(LlvmLibcModfTest, Fractions) { testFractions(&func); } \ 110e7e71e94SSiva Chandra Reddy TEST_F(LlvmLibcModfTest, Range) { testRange(&func); } 111