xref: /aosp_15_r20/external/llvm-libc/test/src/math/smoke/exp2m1f16_test.cpp (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1 //===-- Unittests for exp2m1f16 -------------------------------------------===//
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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "hdr/fenv_macros.h"
10 #include "src/errno/libc_errno.h"
11 #include "src/math/exp2m1f16.h"
12 #include "test/UnitTest/FPMatcher.h"
13 #include "test/UnitTest/Test.h"
14 
15 using LlvmLibcExp2m1f16Test = LIBC_NAMESPACE::testing::FPTest<float16>;
16 
TEST_F(LlvmLibcExp2m1f16Test,SpecialNumbers)17 TEST_F(LlvmLibcExp2m1f16Test, SpecialNumbers) {
18   LIBC_NAMESPACE::libc_errno = 0;
19 
20   EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::exp2m1f16(aNaN));
21   EXPECT_MATH_ERRNO(0);
22 
23   EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::exp2m1f16(sNaN),
24                               FE_INVALID);
25   EXPECT_MATH_ERRNO(0);
26 
27   EXPECT_FP_EQ_ALL_ROUNDING(inf, LIBC_NAMESPACE::exp2m1f16(inf));
28   EXPECT_MATH_ERRNO(0);
29 
30   EXPECT_FP_EQ_ALL_ROUNDING(-1.0, LIBC_NAMESPACE::exp2m1f16(neg_inf));
31   EXPECT_MATH_ERRNO(0);
32 
33   EXPECT_FP_EQ_ALL_ROUNDING(zero, LIBC_NAMESPACE::exp2m1f16(zero));
34   EXPECT_MATH_ERRNO(0);
35 
36   EXPECT_FP_EQ_ALL_ROUNDING(neg_zero, LIBC_NAMESPACE::exp2m1f16(neg_zero));
37   EXPECT_MATH_ERRNO(0);
38 }
39 
TEST_F(LlvmLibcExp2m1f16Test,Overflow)40 TEST_F(LlvmLibcExp2m1f16Test, Overflow) {
41   LIBC_NAMESPACE::libc_errno = 0;
42 
43   EXPECT_FP_EQ_WITH_EXCEPTION(inf, LIBC_NAMESPACE::exp2m1f16(max_normal),
44                               FE_OVERFLOW | FE_INEXACT);
45   EXPECT_MATH_ERRNO(ERANGE);
46 
47   float16 x = 16.0;
48 
49   EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_NEAREST(
50       inf, LIBC_NAMESPACE::exp2m1f16(x), FE_OVERFLOW | FE_INEXACT);
51   EXPECT_MATH_ERRNO(ERANGE);
52 
53   EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_UPWARD(inf, LIBC_NAMESPACE::exp2m1f16(x),
54                                               FE_OVERFLOW | FE_INEXACT);
55   EXPECT_MATH_ERRNO(ERANGE);
56 
57   EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_DOWNWARD(
58       max_normal, LIBC_NAMESPACE::exp2m1f16(x), FE_INEXACT);
59   EXPECT_MATH_ERRNO(0);
60 
61   EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_TOWARD_ZERO(
62       max_normal, LIBC_NAMESPACE::exp2m1f16(x), FE_INEXACT);
63   EXPECT_MATH_ERRNO(0);
64 }
65 
TEST_F(LlvmLibcExp2m1f16Test,ResultNearNegOne)66 TEST_F(LlvmLibcExp2m1f16Test, ResultNearNegOne) {
67   LIBC_NAMESPACE::libc_errno = 0;
68 
69   EXPECT_FP_EQ_WITH_EXCEPTION(-1.0, LIBC_NAMESPACE::exp2m1f16(neg_max_normal),
70                               FE_INEXACT);
71 
72   EXPECT_FP_EQ_ALL_ROUNDING(-0x1.ffcp-1, LIBC_NAMESPACE::exp2m1f16(-11.0));
73 
74   float16 x = -12.0;
75 
76   EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_NEAREST(
77       -1.0, LIBC_NAMESPACE::exp2m1f16(x), FE_INEXACT);
78 
79   EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_UPWARD(
80       -0x1.ffcp-1, LIBC_NAMESPACE::exp2m1f16(x), FE_INEXACT);
81 
82   EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_DOWNWARD(
83       -1.0, LIBC_NAMESPACE::exp2m1f16(x), FE_INEXACT);
84 
85   EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_TOWARD_ZERO(
86       -0x1.ffcp-1, LIBC_NAMESPACE::exp2m1f16(x), FE_INEXACT);
87 }
88