[libc-commits] [libc] [libc][math][c23] implement C23 math function asinpif16 (PR #146226)
via libc-commits
libc-commits at lists.llvm.org
Sat Jun 28 12:01:22 PDT 2025
================
@@ -0,0 +1,106 @@
+//===-- Unittests for asinpif16 -------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/math/asinpif16.h"
+#include "src/math/fabs.h"
+#include "test/UnitTest/FPMatcher.h"
+
+using LlvmLibcAsinpif16Test = LIBC_NAMESPACE::testing::FPTest<float16>;
+
+TEST_F(LlvmLibcAsinpif16Test, SpecialNumbers) {
+ using FPBits = LIBC_NAMESPACE::fputil::FPBits<float16>;
+
+ // zero
+ EXPECT_FP_EQ(0.0f16, LIBC_NAMESPACE::asinpif16(0.0f16));
+
+ // +/-1
+ EXPECT_FP_EQ(float16(0.5), LIBC_NAMESPACE::asinpif16(float16(1.0)));
+ EXPECT_FP_EQ(float16(-0.5), LIBC_NAMESPACE::asinpif16(float16(-1.0)));
+
+ // NaN inputs
+ EXPECT_FP_EQ(FPBits::quiet_nan().get_val(),
+ LIBC_NAMESPACE::asinpif16(FPBits::quiet_nan().get_val()));
+
+ EXPECT_FP_EQ(FPBits::quiet_nan().get_val(),
+ LIBC_NAMESPACE::asinpif16(FPBits::signaling_nan().get_val()));
+
+ // infinity inputs -> should return NaN
+ errno = 0;
+ EXPECT_FP_EQ(FPBits::quiet_nan().get_val(), LIBC_NAMESPACE::asinpif16(inf));
+ EXPECT_MATH_ERRNO(EDOM);
+
+ errno = 0;
+ EXPECT_FP_EQ(FPBits::quiet_nan().get_val(),
+ LIBC_NAMESPACE::asinpif16(neg_inf));
+ EXPECT_MATH_ERRNO(EDOM);
+}
+
+TEST_F(LlvmLibcAsinpif16Test, OutOfRange) {
+ using FPBits = LIBC_NAMESPACE::fputil::FPBits<float16>;
+
+ // Test values > 1
+ errno = 0;
+ EXPECT_FP_EQ(FPBits::quiet_nan().get_val(),
+ LIBC_NAMESPACE::asinpif16(float16(1.5)));
+ EXPECT_MATH_ERRNO(EDOM);
+
+ errno = 0;
+ EXPECT_FP_EQ(FPBits::quiet_nan().get_val(),
+ LIBC_NAMESPACE::asinpif16(float16(2.0)));
+ EXPECT_MATH_ERRNO(EDOM);
+
+ // Test values < -1
+ errno = 0;
+ EXPECT_FP_EQ(FPBits::quiet_nan().get_val(),
+ LIBC_NAMESPACE::asinpif16(float16(-1.5)));
+ EXPECT_MATH_ERRNO(EDOM);
+
+ errno = 0;
+ EXPECT_FP_EQ(FPBits::quiet_nan().get_val(),
+ LIBC_NAMESPACE::asinpif16(float16(-2.0)));
+ EXPECT_MATH_ERRNO(EDOM);
+
+ // Test maximum normal value (should be > 1 for float16)
+ errno = 0;
+ EXPECT_FP_EQ(FPBits::quiet_nan().get_val(),
+ LIBC_NAMESPACE::asinpif16(FPBits::max_normal().get_val()));
+ EXPECT_MATH_ERRNO(EDOM);
+}
+
+TEST_F(LlvmLibcAsinpif16Test, SymmetryProperty) {
+ // Test that asinpi(-x) = -asinpi(x)
+ constexpr float16 test_vals[] = {0.1f16, 0.25f16, 0.5f16, 0.75f16,
+ 0.9f16, 0.99f16, 1.0f16};
+
+ for (float16 x : test_vals) {
+ if (x <= 1.0) {
+ float16 pos_result = LIBC_NAMESPACE::asinpif16(x);
+ float16 neg_result = LIBC_NAMESPACE::asinpif16(-x);
+
+ EXPECT_FP_EQ(pos_result, LIBC_NAMESPACE::fabs(neg_result));
----------------
overmighty wrote:
This line causes a warning from Clang by the way:
```
In file included from /home/overmighty/projects/llvm-project/libc/test/src/math/asinpif16_test.cpp:11:
In file included from /home/overmighty/projects/llvm-project/libc/test/UnitTest/FPMatcher.h:21:
In file included from /home/overmighty/projects/llvm-project/libc/test/UnitTest/Test.h:37:
/home/overmighty/projects/llvm-project/libc/test/UnitTest/LibcTest.h:203:36: warning: implicit conversion loses floating-point precision: 'double' to '_Float16' [-Wimplicit-float-conversion]
203 | return testMatch(Matcher.match(Value), Matcher, ValueStr, MatcherStr, Loc);
| ~~~~~ ^~~~~
/home/overmighty/projects/llvm-project/libc/test/src/math/asinpif16_test.cpp:85:7: note: in instantiation of function template specialization '__llvm_libc_21_0_0_git::testing::Test::matchAndExplain<__llvm_libc_21_0_0_git::testing::FPMatcher<_Float16, __llvm_libc_21_0_0_git::testing::TestCond::EQ>, double>' requested here
85 | EXPECT_FP_EQ(pos_result, LIBC_NAMESPACE::fabs(neg_result));
| ^
/home/overmighty/projects/llvm-project/libc/test/UnitTest/FPMatcher.h:253:3: note: expanded from macro 'EXPECT_FP_EQ'
253 | EXPECT_THAT(actual, LIBC_NAMESPACE::testing::getMatcher< \
| ^
/home/overmighty/projects/llvm-project/libc/test/UnitTest/LibcTest.h:509:3: note: expanded from macro 'EXPECT_THAT'
509 | LIBC_TEST_MATCH_(MATCHER, MATCH, #MATCHER, #MATCH, )
| ^
/home/overmighty/projects/llvm-project/libc/test/UnitTest/LibcTest.h:504:26: note: expanded from macro 'LIBC_TEST_MATCH_'
504 | LIBC_TEST_SCAFFOLDING_(matchAndExplain(MATCHER, MATCH, MATCHER_STR, \
| ^
```
https://github.com/llvm/llvm-project/pull/146226
More information about the libc-commits
mailing list