brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.9 KiB · 1ba0e4c Raw
108 lines · cpp
1//===-- Unittests for exp10m1f16 ------------------------------------------===//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/exp10m1f16.h"13#include "test/UnitTest/FPMatcher.h"14#include "test/UnitTest/Test.h"15 16using LlvmLibcExp10m1f16Test = LIBC_NAMESPACE::testing::FPTest<float16>;17 18TEST_F(LlvmLibcExp10m1f16Test, SpecialNumbers) {19  EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::exp10m1f16(aNaN));20  EXPECT_MATH_ERRNO(0);21 22  EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::exp10m1f16(sNaN),23                              FE_INVALID);24  EXPECT_MATH_ERRNO(0);25 26  EXPECT_FP_EQ_ALL_ROUNDING(inf, LIBC_NAMESPACE::exp10m1f16(inf));27  EXPECT_MATH_ERRNO(0);28 29  EXPECT_FP_EQ_ALL_ROUNDING(LIBC_NAMESPACE::fputil::cast<float16>(-1.0),30                            LIBC_NAMESPACE::exp10m1f16(neg_inf));31  EXPECT_MATH_ERRNO(0);32 33  EXPECT_FP_EQ_ALL_ROUNDING(zero, LIBC_NAMESPACE::exp10m1f16(zero));34  EXPECT_MATH_ERRNO(0);35 36  EXPECT_FP_EQ_ALL_ROUNDING(neg_zero, LIBC_NAMESPACE::exp10m1f16(neg_zero));37  EXPECT_MATH_ERRNO(0);38}39 40TEST_F(LlvmLibcExp10m1f16Test, Overflow) {41  EXPECT_FP_EQ_WITH_EXCEPTION(inf, LIBC_NAMESPACE::exp10m1f16(max_normal),42                              FE_OVERFLOW | FE_INEXACT);43  EXPECT_MATH_ERRNO(ERANGE);44 45  // round(16 * log10(2), HP, RN);46  float16 x = LIBC_NAMESPACE::fputil::cast<float16>(0x1.344p+2);47 48  EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_NEAREST(49      inf, LIBC_NAMESPACE::exp10m1f16(x), FE_OVERFLOW | FE_INEXACT);50  EXPECT_MATH_ERRNO(ERANGE);51 52  EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_UPWARD(53      inf, LIBC_NAMESPACE::exp10m1f16(x), FE_OVERFLOW | FE_INEXACT);54  EXPECT_MATH_ERRNO(ERANGE);55 56  EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_DOWNWARD(57      max_normal, LIBC_NAMESPACE::exp10m1f16(x), FE_INEXACT);58  EXPECT_MATH_ERRNO(0);59 60  EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_TOWARD_ZERO(61      max_normal, LIBC_NAMESPACE::exp10m1f16(x), FE_INEXACT);62  EXPECT_MATH_ERRNO(0);63}64 65TEST_F(LlvmLibcExp10m1f16Test, ResultNearNegOne) {66  EXPECT_FP_EQ_WITH_EXCEPTION(LIBC_NAMESPACE::fputil::cast<float16>(-1.0),67                              LIBC_NAMESPACE::exp10m1f16(neg_max_normal),68                              FE_INEXACT);69 70  // round(-11 * log10(2), HP, RD);71  float16 x = LIBC_NAMESPACE::fputil::cast<float16>(-0x1.a8p+1);72 73  EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_NEAREST(74      LIBC_NAMESPACE::fputil::cast<float16>(-0x1.ffcp-1),75      LIBC_NAMESPACE::exp10m1f16(x), FE_INEXACT);76 77  EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_UPWARD(78      LIBC_NAMESPACE::fputil::cast<float16>(-0x1.ffcp-1),79      LIBC_NAMESPACE::exp10m1f16(x), FE_INEXACT);80 81  EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_DOWNWARD(82      LIBC_NAMESPACE::fputil::cast<float16>(-1.0),83      LIBC_NAMESPACE::exp10m1f16(x), FE_INEXACT);84 85  EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_TOWARD_ZERO(86      LIBC_NAMESPACE::fputil::cast<float16>(-0x1.ffcp-1),87      LIBC_NAMESPACE::exp10m1f16(x), FE_INEXACT);88 89  // Next float16 value below -0x1.ce4p+1.90  x = LIBC_NAMESPACE::fputil::cast<float16>(-0x1.ce8p+1);91 92  EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_NEAREST(93      LIBC_NAMESPACE::fputil::cast<float16>(-1.0),94      LIBC_NAMESPACE::exp10m1f16(x), FE_INEXACT);95 96  EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_UPWARD(97      LIBC_NAMESPACE::fputil::cast<float16>(-0x1.ffcp-1),98      LIBC_NAMESPACE::exp10m1f16(x), FE_INEXACT);99 100  EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_DOWNWARD(101      LIBC_NAMESPACE::fputil::cast<float16>(-1.0),102      LIBC_NAMESPACE::exp10m1f16(x), FE_INEXACT);103 104  EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_TOWARD_ZERO(105      LIBC_NAMESPACE::fputil::cast<float16>(-0x1.ffcp-1),106      LIBC_NAMESPACE::exp10m1f16(x), FE_INEXACT);107}108