Skip to content

Commit 299a753

Browse files
committed
fix behaviour for 'signaling NaN'/'quiet nan' inputs
1 parent c6002ff commit 299a753

File tree

2 files changed

+10
-3
lines changed

2 files changed

+10
-3
lines changed

libc/src/math/generic/asinf16.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,13 @@ LLVM_LIBC_FUNCTION(float16, asinf16, (float16 x)) {
6565

6666
// |x| > 1, asinf16(x) = NaN
6767
if (LIBC_UNLIKELY(x_abs > 0x3c00)) {
68-
fputil::set_errno_if_required(EDOM);
69-
fputil::raise_except_if_required(FE_INVALID);
68+
// |x| <= +/-inf
69+
if (LIBC_UNLIKELY(x_abs <= 0x7c00)) {
70+
if (!xbits.is_signaling_nan())
71+
fputil::set_errno_if_required(EDOM);
72+
73+
fputil::raise_except_if_required(FE_INVALID);
74+
}
7075

7176
return FPBits::quiet_nan().get_val();
7277
}
@@ -91,7 +96,7 @@ LLVM_LIBC_FUNCTION(float16, asinf16, (float16 x)) {
9196
// 2 * asin(sqrt(u)) = z
9297
// 9: Recall [3], z = pi/2 - y. Therefore:
9398
// y = pi/2 - z
94-
// y = pi/2 - 2 * arcsin(sqrt(u))
99+
// y = pi/2 - 2 * asin(sqrt(u))
95100
// 10: Recall [1], y = asin(x). Therefore:
96101
// asin(x) = pi/2 - 2 * asin(sqrt(u))
97102
//

libc/test/src/math/smoke/asinf16_test.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ using LlvmLibcAsinf16Test = LIBC_NAMESPACE::testing::FPTest<float16>;
1616

1717
TEST_F(LlvmLibcAsinf16Test, SpecialNumbers) {
1818
LIBC_NAMESPACE::libc_errno = 0;
19+
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::asinf16(aNaN));
20+
EXPECT_MATH_ERRNO(0);
1921

2022
EXPECT_FP_EQ(zero, LIBC_NAMESPACE::asinf16(zero));
2123
EXPECT_MATH_ERRNO(0);

0 commit comments

Comments
 (0)