brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.8 KiB · e00cb0a Raw
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