15fedf7f4SSiva Chandra Reddy //===-- Unittests for cosf ------------------------------------------------===//
25fedf7f4SSiva Chandra Reddy //
35fedf7f4SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45fedf7f4SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
55fedf7f4SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65fedf7f4SSiva Chandra Reddy //
75fedf7f4SSiva Chandra Reddy //===----------------------------------------------------------------------===//
85fedf7f4SSiva Chandra Reddy 
9f362aea4SSiva Chandra Reddy #include "src/__support/CPP/Array.h"
10c120edc7SMichael Jones #include "src/__support/FPUtil/FPBits.h"
115fedf7f4SSiva Chandra Reddy #include "src/math/cosf.h"
125fedf7f4SSiva Chandra Reddy #include "test/src/math/sdcomp26094.h"
135fedf7f4SSiva Chandra Reddy #include "utils/MPFRWrapper/MPFRUtils.h"
146c3f53c7SSiva Chandra Reddy #include "utils/UnitTest/FPMatcher.h"
155fedf7f4SSiva Chandra Reddy #include "utils/UnitTest/Test.h"
163e18fb33SMichael Jones #include <math.h>
175fedf7f4SSiva Chandra Reddy 
1835e2e448SSiva Chandra Reddy #include <errno.h>
195fedf7f4SSiva Chandra Reddy #include <stdint.h>
205fedf7f4SSiva Chandra Reddy 
2125226f3eSMichael Jones using __llvm_libc::testing::SDCOMP26094_VALUES;
22e7e71e94SSiva Chandra Reddy using FPBits = __llvm_libc::fputil::FPBits<float>;
235fedf7f4SSiva Chandra Reddy 
245fedf7f4SSiva Chandra Reddy namespace mpfr = __llvm_libc::testing::mpfr;
255fedf7f4SSiva Chandra Reddy 
26e7e71e94SSiva Chandra Reddy DECLARE_SPECIAL_CONSTANTS(float)
27e7e71e94SSiva Chandra Reddy 
TEST(LlvmLibcCosfTest,SpecialNumbers)281df0dbfcSMichael Jones TEST(LlvmLibcCosfTest, SpecialNumbers) {
2935e2e448SSiva Chandra Reddy   errno = 0;
305fedf7f4SSiva Chandra Reddy 
31e7e71e94SSiva Chandra Reddy   EXPECT_FP_EQ(aNaN, __llvm_libc::cosf(aNaN));
32*ffb410d3STue Ly   EXPECT_MATH_ERRNO(0);
335fedf7f4SSiva Chandra Reddy 
34e7e71e94SSiva Chandra Reddy   EXPECT_FP_EQ(1.0f, __llvm_libc::cosf(0.0f));
35*ffb410d3STue Ly   EXPECT_MATH_ERRNO(0);
365fedf7f4SSiva Chandra Reddy 
37e7e71e94SSiva Chandra Reddy   EXPECT_FP_EQ(1.0f, __llvm_libc::cosf(-0.0f));
38*ffb410d3STue Ly   EXPECT_MATH_ERRNO(0);
395fedf7f4SSiva Chandra Reddy 
40e7e71e94SSiva Chandra Reddy   EXPECT_FP_EQ(aNaN, __llvm_libc::cosf(inf));
41*ffb410d3STue Ly   EXPECT_MATH_ERRNO(EDOM);
425fedf7f4SSiva Chandra Reddy 
431c92911eSMichael Jones   EXPECT_FP_EQ(aNaN, __llvm_libc::cosf(neg_inf));
44*ffb410d3STue Ly   EXPECT_MATH_ERRNO(EDOM);
455fedf7f4SSiva Chandra Reddy }
465fedf7f4SSiva Chandra Reddy 
TEST(LlvmLibcCosfTest,InFloatRange)471df0dbfcSMichael Jones TEST(LlvmLibcCosfTest, InFloatRange) {
4825226f3eSMichael Jones   constexpr uint32_t COUNT = 1000000;
4925226f3eSMichael Jones   constexpr uint32_t STEP = UINT32_MAX / COUNT;
5025226f3eSMichael Jones   for (uint32_t i = 0, v = 0; i <= COUNT; ++i, v += STEP) {
51e7e71e94SSiva Chandra Reddy     float x = float(FPBits(v));
525fedf7f4SSiva Chandra Reddy     if (isnan(x) || isinf(x))
535fedf7f4SSiva Chandra Reddy       continue;
54ed8982daSSiva Chandra Reddy     ASSERT_MPFR_MATCH(mpfr::Operation::Cos, x, __llvm_libc::cosf(x), 1.0);
555fedf7f4SSiva Chandra Reddy   }
565fedf7f4SSiva Chandra Reddy }
575fedf7f4SSiva Chandra Reddy 
585fedf7f4SSiva Chandra Reddy // For small values, cos(x) is 1.
TEST(LlvmLibcCosfTest,SmallValues)591df0dbfcSMichael Jones TEST(LlvmLibcCosfTest, SmallValues) {
60e7e71e94SSiva Chandra Reddy   float x = float(FPBits(0x17800000U));
615fedf7f4SSiva Chandra Reddy   float result = __llvm_libc::cosf(x);
62ed8982daSSiva Chandra Reddy   EXPECT_MPFR_MATCH(mpfr::Operation::Cos, x, result, 1.0);
63e7e71e94SSiva Chandra Reddy   EXPECT_FP_EQ(1.0f, result);
645fedf7f4SSiva Chandra Reddy 
65e7e71e94SSiva Chandra Reddy   x = float(FPBits(0x0040000U));
665fedf7f4SSiva Chandra Reddy   result = __llvm_libc::cosf(x);
67ed8982daSSiva Chandra Reddy   EXPECT_MPFR_MATCH(mpfr::Operation::Cos, x, result, 1.0);
68e7e71e94SSiva Chandra Reddy   EXPECT_FP_EQ(1.0f, result);
695fedf7f4SSiva Chandra Reddy }
705fedf7f4SSiva Chandra Reddy 
715fedf7f4SSiva Chandra Reddy // SDCOMP-26094: check cosf in the cases for which the range reducer
725fedf7f4SSiva Chandra Reddy // returns values furthest beyond its nominal upper bound of pi/4.
TEST(LlvmLibcCosfTest,SDCOMP_26094)731df0dbfcSMichael Jones TEST(LlvmLibcCosfTest, SDCOMP_26094) {
7425226f3eSMichael Jones   for (uint32_t v : SDCOMP26094_VALUES) {
75e7e71e94SSiva Chandra Reddy     float x = float(FPBits(v));
76ed8982daSSiva Chandra Reddy     ASSERT_MPFR_MATCH(mpfr::Operation::Cos, x, __llvm_libc::cosf(x), 1.0);
775fedf7f4SSiva Chandra Reddy   }
785fedf7f4SSiva Chandra Reddy }
79