Skip to content

Commit 72ccdd8

Browse files
[libc][math][C23] Cospif function should only return unsigned zeros (#98037)
Patches the cospif function, which should always return unsigned zeros as specified in the standard. Also updates unit tests.
1 parent 3670e7f commit 72ccdd8

File tree

2 files changed

+8
-8
lines changed

2 files changed

+8
-8
lines changed

libc/src/math/generic/cospif.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ LLVM_LIBC_FUNCTION(float, cospif, (float x)) {
2121
using FPBits = typename fputil::FPBits<float>;
2222

2323
FPBits xbits(x);
24-
Sign xsign = xbits.sign();
2524
xbits.set_sign(Sign::POS);
2625

2726
uint32_t x_abs = xbits.uintval();
@@ -86,7 +85,7 @@ LLVM_LIBC_FUNCTION(float, cospif, (float x)) {
8685
sincospif_eval(xd, sin_k, cos_k, sin_y, cosm1_y);
8786

8887
if (LIBC_UNLIKELY(sin_y == 0 && cos_k == 0)) {
89-
return FPBits::zero(xsign).get_val();
88+
return 0.0f;
9089
}
9190

9291
return static_cast<float>(fputil::multiply_add(

libc/test/src/math/cospif_test.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,10 @@ TEST_F(LlvmLibcCospifTest, SpecialNumbers) {
3838
}
3939

4040
TEST_F(LlvmLibcCospifTest, SpecificBitPatterns) {
41-
constexpr int N = 36;
41+
constexpr int N = 38;
4242
constexpr uint32_t INPUTS[N] = {
43+
0x3f00'0000U, // x = 0.5
44+
0x461d'd600U, // x = 10101.5
4345
0x3f06'0a92U, // x = pi/6
4446
0x3f3a'dc51U, // x = 0x1.75b8a2p-1f
4547
0x3f49'0fdbU, // x = pi/4
@@ -108,13 +110,12 @@ TEST_F(LlvmLibcCospifTest, SDCOMP_26094) {
108110
}
109111
}
110112

111-
// sinpi(-n) = -0.0
112-
// sinpi(+n) = +0.0
113+
// sinpi(+n + 0.5) = sinpi(-n + 0.5) = +0.0
113114
TEST_F(LlvmLibcCospifTest, SignedZeros) {
114115
EXPECT_FP_EQ(0.0, LIBC_NAMESPACE::cospif(100.5f));
115-
EXPECT_FP_EQ(-0.0, LIBC_NAMESPACE::cospif(-100.5f));
116+
EXPECT_FP_EQ(0.0, LIBC_NAMESPACE::cospif(-100.5f));
116117
EXPECT_FP_EQ(0.0, LIBC_NAMESPACE::cospif(45678.5f));
117-
EXPECT_FP_EQ(-0.0, LIBC_NAMESPACE::cospif(-45678.5f));
118+
EXPECT_FP_EQ(0.0, LIBC_NAMESPACE::cospif(-45678.5f));
118119
EXPECT_FP_EQ(0.0, LIBC_NAMESPACE::cospif(8000000.5f));
119-
EXPECT_FP_EQ(-0.0, LIBC_NAMESPACE::cospif(-8000000.5f));
120+
EXPECT_FP_EQ(0.0, LIBC_NAMESPACE::cospif(-8000000.5f));
120121
}

0 commit comments

Comments
 (0)