120 lines · cpp
1//===-- Unittests for atanhf ----------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "hdr/errno_macros.h"10#include "hdr/math_macros.h"11#include "hdr/stdint_proxy.h"12#include "src/__support/FPUtil/FPBits.h"13#include "src/math/atanhf.h"14#include "test/UnitTest/FPMatcher.h"15#include "test/UnitTest/Test.h"16#include "utils/MPFRWrapper/MPFRUtils.h"17 18using LlvmLibcAtanhfTest = LIBC_NAMESPACE::testing::FPTest<float>;19using LIBC_NAMESPACE::Sign;20 21namespace mpfr = LIBC_NAMESPACE::testing::mpfr;22 23// TODO: This test needs to have its checks for exceptions, errno24// tightened https://github.com/llvm/llvm-project/issues/88819.25TEST_F(LlvmLibcAtanhfTest, SpecialNumbers) {26 LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);27 EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atanhf(aNaN));28 // TODO: Uncomment these checks later, RoundingMode affects running29 // tests in this way https://github.com/llvm/llvm-project/issues/90653.30 // EXPECT_FP_EXCEPTION(0);31 EXPECT_MATH_ERRNO(0);32 33 LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);34 EXPECT_FP_EQ_ALL_ROUNDING(0.0f, LIBC_NAMESPACE::atanhf(0.0f));35 // See above TODO36 // EXPECT_FP_EXCEPTION(0);37 EXPECT_MATH_ERRNO(0);38 39 LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);40 EXPECT_FP_EQ_ALL_ROUNDING(-0.0f, LIBC_NAMESPACE::atanhf(-0.0f));41 // See above TODO42 // EXPECT_FP_EXCEPTION(0);43 EXPECT_MATH_ERRNO(0);44 45 LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);46 EXPECT_FP_EQ_ALL_ROUNDING(inf, LIBC_NAMESPACE::atanhf(1.0f));47 // See above TODO48 // EXPECT_FP_EXCEPTION(FE_DIVBYZERO);49 EXPECT_MATH_ERRNO(ERANGE);50 51 LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);52 EXPECT_FP_EQ_ALL_ROUNDING(neg_inf, LIBC_NAMESPACE::atanhf(-1.0f));53 // See above TODO54 // EXPECT_FP_EXCEPTION(FE_DIVBYZERO);55 EXPECT_MATH_ERRNO(ERANGE);56 57 auto bt = FPBits(1.0f);58 bt.set_uintval(bt.uintval() + 1);59 60 LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);61 EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atanhf(bt.get_val()));62 // EXPECT_FP_EXCEPTION(FE_INVALID);63 EXPECT_MATH_ERRNO(EDOM);64 65 LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);66 bt.set_sign(Sign::NEG);67 EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atanhf(bt.get_val()));68 // See above TODO69 // EXPECT_FP_EXCEPTION(FE_INVALID);70 EXPECT_MATH_ERRNO(EDOM);71 72 LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);73 EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atanhf(2.0f));74 // See above TODO75 // EXPECT_FP_EXCEPTION(FE_INVALID);76 EXPECT_MATH_ERRNO(EDOM);77 78 LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);79 EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atanhf(-2.0f));80 // EXPECT_FP_EXCEPTION(FE_INVALID);81 EXPECT_MATH_ERRNO(EDOM);82 83 LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);84 EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atanhf(inf));85 // See above TODO86 // EXPECT_FP_EXCEPTION(FE_INVALID);87 EXPECT_MATH_ERRNO(EDOM);88 89 bt.set_sign(Sign::NEG);90 EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atanhf(neg_inf));91 // See above TODO92 // EXPECT_FP_EXCEPTION(FE_INVALID);93 EXPECT_MATH_ERRNO(EDOM);94}95 96TEST_F(LlvmLibcAtanhfTest, InFloatRange) {97 constexpr uint32_t COUNT = 100'000;98 const uint32_t STEP = FPBits(1.0f).uintval() / COUNT;99 for (uint32_t i = 0, v = 0; i <= COUNT; ++i, v += STEP) {100 float x = FPBits(v).get_val();101 ASSERT_MPFR_MATCH(mpfr::Operation::Atanh, x, LIBC_NAMESPACE::atanhf(x),102 0.5);103 ASSERT_MPFR_MATCH(mpfr::Operation::Atanh, -x, LIBC_NAMESPACE::atanhf(-x),104 0.5);105 }106}107 108// For small values, atanh(x) is x.109TEST_F(LlvmLibcAtanhfTest, SmallValues) {110 float x = FPBits(uint32_t(0x17800000)).get_val();111 float result = LIBC_NAMESPACE::atanhf(x);112 EXPECT_MPFR_MATCH(mpfr::Operation::Atanh, x, result, 0.5);113 EXPECT_FP_EQ(x, result);114 115 x = FPBits(uint32_t(0x00400000)).get_val();116 result = LIBC_NAMESPACE::atanhf(x);117 EXPECT_MPFR_MATCH(mpfr::Operation::Atanh, x, result, 0.5);118 EXPECT_FP_EQ(x, result);119}120