Skip to content

Commit bf172b1

Browse files
committed
make an exhaustive test for asinpif16
1 parent 521296d commit bf172b1

File tree

6 files changed

+34
-89
lines changed

6 files changed

+34
-89
lines changed

libc/test/src/math/CMakeLists.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2275,9 +2275,7 @@ add_fp_unittest(
22752275
SRCS
22762276
asinpif16_test.cpp
22772277
DEPENDS
2278-
libc.src.math.fabs
22792278
libc.src.math.asinpif16
2280-
libc.src.__support.FPUtil.fp_bits
22812279
)
22822280

22832281
add_fp_unittest(
Lines changed: 24 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//===-- Unittests for asinpif16 -------------------------------------------===//
1+
//===-- Exhaustive test for asinpif16 -------------------------------------===//
22
//
33
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
44
// See https://llvm.org/LICENSE.txt for license information.
@@ -7,101 +7,38 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "src/math/asinpif16.h"
10-
#include "src/math/fabs.h"
1110
#include "test/UnitTest/FPMatcher.h"
11+
#include "test/UnitTest/Test.h"
12+
#include "utils/MPFRWrapper/MPFRUtils.h"
1213

1314
using LlvmLibcAsinpif16Test = LIBC_NAMESPACE::testing::FPTest<float16>;
1415

15-
TEST_F(LlvmLibcAsinpif16Test, SpecialNumbers) {
16-
using FPBits = LIBC_NAMESPACE::fputil::FPBits<float16>;
16+
namespace mpfr = LIBC_NAMESPACE::testing::mpfr;
1717

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;
2021

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;
2425

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;
8832
}
8933
}
9034

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;
10643
}
10744
}

libc/utils/MPFRWrapper/MPCommon.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,12 @@ MPFRNumber MPFRNumber::asinh() const {
105105
return result;
106106
}
107107

108+
MPFRNumber MPFRNumber::asinpi() const {
109+
MPFRNumber result(*this);
110+
mpfr_asinpi(result.value, value, mpfr_rounding);
111+
return result;
112+
}
113+
108114
MPFRNumber MPFRNumber::atan() const {
109115
MPFRNumber result(*this);
110116
mpfr_atan(result.value, value, mpfr_rounding);

libc/utils/MPFRWrapper/MPCommon.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ class MPFRNumber {
185185
MPFRNumber add(const MPFRNumber &b) const;
186186
MPFRNumber asin() const;
187187
MPFRNumber asinh() const;
188+
MPFRNumber asinpi() const;
188189
MPFRNumber atan() const;
189190
MPFRNumber atan2(const MPFRNumber &b);
190191
MPFRNumber atanh() const;

libc/utils/MPFRWrapper/MPFRUtils.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ unary_operation(Operation op, InputType input, unsigned int precision,
3838
return mpfrInput.asin();
3939
case Operation::Asinh:
4040
return mpfrInput.asinh();
41+
case Operation::Asinpi:
42+
return mpfrInput.asinpi();
4143
case Operation::Atan:
4244
return mpfrInput.atan();
4345
case Operation::Atanh:

libc/utils/MPFRWrapper/MPFRUtils.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ enum class Operation : int {
3131
Acospi,
3232
Asin,
3333
Asinh,
34+
Asinpi,
3435
Atan,
3536
Atanh,
3637
Cbrt,

0 commit comments

Comments
 (0)