140 lines · cpp
1//===-- Unittests for tanhf16 ---------------------------------------------===//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/fenv_macros.h"11#include "src/__support/FPUtil/cast.h"12#include "src/math/tanhf16.h"13#include "test/UnitTest/FPMatcher.h"14#include "test/UnitTest/Test.h"15 16using LlvmLibcTanhf16Test = LIBC_NAMESPACE::testing::FPTest<float16>;17 18TEST_F(LlvmLibcTanhf16Test, SpecialNumbers) {19 EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::tanhf16(aNaN));20 EXPECT_MATH_ERRNO(0);21 22 EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::tanhf16(sNaN), FE_INVALID);23 EXPECT_MATH_ERRNO(0);24 25 EXPECT_FP_EQ_ALL_ROUNDING(LIBC_NAMESPACE::fputil::cast<float16>(1.0),26 LIBC_NAMESPACE::tanhf16(inf));27 EXPECT_MATH_ERRNO(0);28 29 EXPECT_FP_EQ_ALL_ROUNDING(LIBC_NAMESPACE::fputil::cast<float16>(-1.0),30 LIBC_NAMESPACE::tanhf16(neg_inf));31 EXPECT_MATH_ERRNO(0);32 33 EXPECT_FP_EQ_ALL_ROUNDING(zero, LIBC_NAMESPACE::tanhf16(zero));34 EXPECT_MATH_ERRNO(0);35 36 EXPECT_FP_EQ_ALL_ROUNDING(neg_zero, LIBC_NAMESPACE::tanhf16(neg_zero));37 EXPECT_MATH_ERRNO(0);38}39 40TEST_F(LlvmLibcTanhf16Test, ResultNearBounds) {41 EXPECT_FP_EQ_WITH_EXCEPTION(LIBC_NAMESPACE::fputil::cast<float16>(1.0),42 LIBC_NAMESPACE::tanhf16(max_normal), FE_INEXACT);43 EXPECT_MATH_ERRNO(0);44 45 EXPECT_FP_EQ_WITH_EXCEPTION(LIBC_NAMESPACE::fputil::cast<float16>(-1.0),46 LIBC_NAMESPACE::tanhf16(neg_max_normal),47 FE_INEXACT);48 EXPECT_MATH_ERRNO(0);49 50 // round(atanh(1 - 2^-11), HP, RU);51 float16 x = LIBC_NAMESPACE::fputil::cast<float16>(0x1.0a4p+2);52 53 EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_NEAREST(54 LIBC_NAMESPACE::fputil::cast<float16>(0x1.ffcp-1),55 LIBC_NAMESPACE::tanhf16(x), FE_INEXACT);56 EXPECT_MATH_ERRNO(0);57 58 EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_UPWARD(59 LIBC_NAMESPACE::fputil::cast<float16>(1.0), LIBC_NAMESPACE::tanhf16(x),60 FE_INEXACT);61 EXPECT_MATH_ERRNO(0);62 63 EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_DOWNWARD(64 LIBC_NAMESPACE::fputil::cast<float16>(0x1.ffcp-1),65 LIBC_NAMESPACE::tanhf16(x), FE_INEXACT);66 EXPECT_MATH_ERRNO(0);67 68 EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_TOWARD_ZERO(69 LIBC_NAMESPACE::fputil::cast<float16>(0x1.ffcp-1),70 LIBC_NAMESPACE::tanhf16(x), FE_INEXACT);71 EXPECT_MATH_ERRNO(0);72 73 x = LIBC_NAMESPACE::fputil::cast<float16>(0x1.208p+2);74 75 EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_NEAREST(76 LIBC_NAMESPACE::fputil::cast<float16>(1.0), LIBC_NAMESPACE::tanhf16(x),77 FE_INEXACT);78 EXPECT_MATH_ERRNO(0);79 80 EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_UPWARD(81 LIBC_NAMESPACE::fputil::cast<float16>(1.0), LIBC_NAMESPACE::tanhf16(x),82 FE_INEXACT);83 EXPECT_MATH_ERRNO(0);84 85 EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_DOWNWARD(86 LIBC_NAMESPACE::fputil::cast<float16>(0x1.ffcp-1),87 LIBC_NAMESPACE::tanhf16(x), FE_INEXACT);88 EXPECT_MATH_ERRNO(0);89 90 EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_TOWARD_ZERO(91 LIBC_NAMESPACE::fputil::cast<float16>(0x1.ffcp-1),92 LIBC_NAMESPACE::tanhf16(x), FE_INEXACT);93 EXPECT_MATH_ERRNO(0);94 95 // round(atanh(-1 + 2^-11), HP, RD);96 x = LIBC_NAMESPACE::fputil::cast<float16>(-0x1.0a4p+2);97 98 EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_NEAREST(99 LIBC_NAMESPACE::fputil::cast<float16>(-0x1.ffcp-1),100 LIBC_NAMESPACE::tanhf16(x), FE_INEXACT);101 EXPECT_MATH_ERRNO(0);102 103 EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_UPWARD(104 LIBC_NAMESPACE::fputil::cast<float16>(-0x1.ffcp-1),105 LIBC_NAMESPACE::tanhf16(x), FE_INEXACT);106 EXPECT_MATH_ERRNO(0);107 108 EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_DOWNWARD(109 LIBC_NAMESPACE::fputil::cast<float16>(-1.0), LIBC_NAMESPACE::tanhf16(x),110 FE_INEXACT);111 EXPECT_MATH_ERRNO(0);112 113 EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_TOWARD_ZERO(114 LIBC_NAMESPACE::fputil::cast<float16>(-0x1.ffcp-1),115 LIBC_NAMESPACE::tanhf16(x), FE_INEXACT);116 EXPECT_MATH_ERRNO(0);117 118 x = LIBC_NAMESPACE::fputil::cast<float16>(-0x1.208p+2);119 120 EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_NEAREST(121 LIBC_NAMESPACE::fputil::cast<float16>(-1.0), LIBC_NAMESPACE::tanhf16(x),122 FE_INEXACT);123 EXPECT_MATH_ERRNO(0);124 125 EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_UPWARD(126 LIBC_NAMESPACE::fputil::cast<float16>(-0x1.ffcp-1),127 LIBC_NAMESPACE::tanhf16(x), FE_INEXACT);128 EXPECT_MATH_ERRNO(0);129 130 EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_DOWNWARD(131 LIBC_NAMESPACE::fputil::cast<float16>(-1.0), LIBC_NAMESPACE::tanhf16(x),132 FE_INEXACT);133 EXPECT_MATH_ERRNO(0);134 135 EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_TOWARD_ZERO(136 LIBC_NAMESPACE::fputil::cast<float16>(-0x1.ffcp-1),137 LIBC_NAMESPACE::tanhf16(x), FE_INEXACT);138 EXPECT_MATH_ERRNO(0);139}140