|
1 | | -//===-- Unittests for asinpif16 -------------------------------------------===// |
| 1 | +//===-- Exhaustive test for asinpif16 -------------------------------------===// |
2 | 2 | // |
3 | 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | 4 | // See https://llvm.org/LICENSE.txt for license information. |
|
7 | 7 | //===----------------------------------------------------------------------===// |
8 | 8 |
|
9 | 9 | #include "src/math/asinpif16.h" |
10 | | -#include "src/math/fabs.h" |
11 | 10 | #include "test/UnitTest/FPMatcher.h" |
| 11 | +#include "test/UnitTest/Test.h" |
| 12 | +#include "utils/MPFRWrapper/MPFRUtils.h" |
12 | 13 |
|
13 | 14 | using LlvmLibcAsinpif16Test = LIBC_NAMESPACE::testing::FPTest<float16>; |
14 | 15 |
|
15 | | -TEST_F(LlvmLibcAsinpif16Test, SpecialNumbers) { |
16 | | - using FPBits = LIBC_NAMESPACE::fputil::FPBits<float16>; |
| 16 | +namespace mpfr = LIBC_NAMESPACE::testing::mpfr; |
17 | 17 |
|
18 | | - // zero |
19 | | - EXPECT_FP_EQ(0.0f16, LIBC_NAMESPACE::asinpif16(0.0f16)); |
| 18 | +// Range: [0, Inf] |
| 19 | +static constexpr uint16_t POS_START = 0x0000U; |
| 20 | +static constexpr uint16_t POS_STOP = 0x7c00U; |
20 | 21 |
|
21 | | - // +/-1 |
22 | | - EXPECT_FP_EQ(float16(0.5), LIBC_NAMESPACE::asinpif16(float16(1.0))); |
23 | | - EXPECT_FP_EQ(float16(-0.5), LIBC_NAMESPACE::asinpif16(float16(-1.0))); |
| 22 | +// Range: [-Inf, 0] |
| 23 | +static constexpr uint16_t NEG_START = 0x8000U; |
| 24 | +static constexpr uint16_t NEG_STOP = 0xfc00U; |
24 | 25 |
|
25 | | - // NaN inputs |
26 | | - EXPECT_FP_EQ(FPBits::quiet_nan().get_val(), |
27 | | - LIBC_NAMESPACE::asinpif16(FPBits::quiet_nan().get_val())); |
28 | | - |
29 | | - EXPECT_FP_EQ(FPBits::quiet_nan().get_val(), |
30 | | - LIBC_NAMESPACE::asinpif16(FPBits::signaling_nan().get_val())); |
31 | | - |
32 | | - // infinity inputs -> should return NaN |
33 | | - errno = 0; |
34 | | - EXPECT_FP_EQ(FPBits::quiet_nan().get_val(), LIBC_NAMESPACE::asinpif16(inf)); |
35 | | - EXPECT_MATH_ERRNO(EDOM); |
36 | | - |
37 | | - errno = 0; |
38 | | - EXPECT_FP_EQ(FPBits::quiet_nan().get_val(), |
39 | | - LIBC_NAMESPACE::asinpif16(neg_inf)); |
40 | | - EXPECT_MATH_ERRNO(EDOM); |
41 | | -} |
42 | | - |
43 | | -TEST_F(LlvmLibcAsinpif16Test, OutOfRange) { |
44 | | - using FPBits = LIBC_NAMESPACE::fputil::FPBits<float16>; |
45 | | - |
46 | | - // Test values > 1 |
47 | | - errno = 0; |
48 | | - EXPECT_FP_EQ(FPBits::quiet_nan().get_val(), |
49 | | - LIBC_NAMESPACE::asinpif16(float16(1.5))); |
50 | | - EXPECT_MATH_ERRNO(EDOM); |
51 | | - |
52 | | - errno = 0; |
53 | | - EXPECT_FP_EQ(FPBits::quiet_nan().get_val(), |
54 | | - LIBC_NAMESPACE::asinpif16(float16(2.0))); |
55 | | - EXPECT_MATH_ERRNO(EDOM); |
56 | | - |
57 | | - // Test values < -1 |
58 | | - errno = 0; |
59 | | - EXPECT_FP_EQ(FPBits::quiet_nan().get_val(), |
60 | | - LIBC_NAMESPACE::asinpif16(float16(-1.5))); |
61 | | - EXPECT_MATH_ERRNO(EDOM); |
62 | | - |
63 | | - errno = 0; |
64 | | - EXPECT_FP_EQ(FPBits::quiet_nan().get_val(), |
65 | | - LIBC_NAMESPACE::asinpif16(float16(-2.0))); |
66 | | - EXPECT_MATH_ERRNO(EDOM); |
67 | | - |
68 | | - // Test maximum normal value (should be > 1 for float16) |
69 | | - errno = 0; |
70 | | - EXPECT_FP_EQ(FPBits::quiet_nan().get_val(), |
71 | | - LIBC_NAMESPACE::asinpif16(FPBits::max_normal().get_val())); |
72 | | - EXPECT_MATH_ERRNO(EDOM); |
73 | | -} |
74 | | - |
75 | | -TEST_F(LlvmLibcAsinpif16Test, SymmetryProperty) { |
76 | | - // Test that asinpi(-x) = -asinpi(x) |
77 | | - constexpr float16 test_vals[] = {0.1f16, 0.25f16, 0.5f16, 0.75f16, |
78 | | - 0.9f16, 0.99f16, 1.0f16}; |
79 | | - |
80 | | - for (float16 x : test_vals) { |
81 | | - if (x <= 1.0) { |
82 | | - float16 pos_result = LIBC_NAMESPACE::asinpif16(x); |
83 | | - float16 neg_result = LIBC_NAMESPACE::asinpif16(-x); |
84 | | - |
85 | | - EXPECT_FP_EQ(pos_result, |
86 | | - static_cast<float16>(LIBC_NAMESPACE::fabs(neg_result))); |
87 | | - } |
| 26 | +TEST_F(LlvmLibcAsinpif16Test, PositiveRange) { |
| 27 | + for (uint16_t v = POS_START; v <= POS_STOP; ++v) { |
| 28 | + float16 x = FPBits(v).get_val(); |
| 29 | + EXPECT_MPFR_MATCH_ALL_ROUNDING(mpfr::Operation::Asinpi, x, |
| 30 | + LIBC_NAMESPACE::asinpif16(x), 0.5); |
| 31 | + break; |
88 | 32 | } |
89 | 33 | } |
90 | 34 |
|
91 | | -TEST_F(LlvmLibcAsinpif16Test, RangeValidation) { |
92 | | - // Test that output is always in [-0.5, 0.5] for valid inputs |
93 | | - constexpr int num_tests = 1000; |
94 | | - |
95 | | - for (int i = 0; i <= num_tests; ++i) { |
96 | | - float16 t = -1.0f16 + (2.0f16 * static_cast<float16>(i)) / |
97 | | - static_cast<float16>(num_tests); |
98 | | - |
99 | | - if (LIBC_NAMESPACE::fabs(t) <= 1.0) { |
100 | | - float16 result = LIBC_NAMESPACE::asinpif16(t); |
101 | | - |
102 | | - // should be in [-0.5, 0.5] |
103 | | - EXPECT_TRUE(result >= -0.5f16); |
104 | | - EXPECT_TRUE(result <= 0.5f16); |
105 | | - } |
| 35 | +TEST_F(LlvmLibcAsinpif16Test, NegativeRange) { |
| 36 | + int i = 0; |
| 37 | + for (uint16_t v = NEG_START; v <= NEG_STOP; ++v) { |
| 38 | + float16 x = FPBits(v).get_val(); |
| 39 | + EXPECT_MPFR_MATCH_ALL_ROUNDING(mpfr::Operation::Asinpi, -x, |
| 40 | + LIBC_NAMESPACE::asinpif16(-x), 0.5); |
| 41 | + if (i++ == 10) |
| 42 | + break; |
106 | 43 | } |
107 | 44 | } |
0 commit comments