Skip to content

Commit 7ea78c4

Browse files
author
Job Hernandez
committed
make the smoke tests pass
1 parent a56711d commit 7ea78c4

File tree

2 files changed

+16
-13
lines changed

2 files changed

+16
-13
lines changed

libc/src/math/generic/cospi.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,21 +59,27 @@ LLVM_LIBC_FUNCTION(double, cospi, (double x)) {
5959
using FPBits = typename fputil::FPBits<double>;
6060
FPBits xbits(x);
6161

62+
xbits.set_sign(Sign::POS);
63+
64+
uint64_t x_abs_ = xbits.uintval();
6265
double x_abs = fputil::abs(x);
6366
double p = 0x1p52; // 2^p where p is the precision
64-
67+
double p2 = 0x1p53;
68+
double p3 = 1.0;
6569
if (LIBC_UNLIKELY(x_abs == 0U))
66-
return x;
70+
return p3;
6771

6872
if (x_abs >= p) {
73+
if (x_abs < p2)
74+
return ((x_abs_ & 0x1) ? -p3 : p3);
6975
if (xbits.is_nan())
7076
return x;
7177
if (xbits.is_inf()) {
7278
fputil::set_errno_if_required(EDOM);
7379
fputil::raise_except_if_required(FE_INVALID);
74-
return FPBits::quiet_nan().get_val();
80+
return x + FPBits::quiet_nan().get_val();
7581
}
76-
return FPBits::zero(xbits.sign()).get_val();
82+
return p3;
7783
}
7884
double n = pow(2, -52);
7985
double k = fputil::nearest_integer(x * n);

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

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ TEST_F(LlvmLibcCospiTest, SpecialNumbers) {
2020
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::cospi(aNaN));
2121
EXPECT_MATH_ERRNO(0);
2222

23-
EXPECT_FP_EQ(zero, LIBC_NAMESPACE::cospi(zero));
23+
EXPECT_FP_EQ(FPBits::one().get_val(), LIBC_NAMESPACE::cospi(zero));
2424
EXPECT_MATH_ERRNO(0);
2525

26-
EXPECT_FP_EQ(neg_zero, LIBC_NAMESPACE::cospi(neg_zero));
26+
EXPECT_FP_EQ(FPBits::one().get_val(), LIBC_NAMESPACE::cospi(neg_zero));
2727
EXPECT_MATH_ERRNO(0);
2828

2929
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::cospi(inf));
@@ -34,15 +34,12 @@ TEST_F(LlvmLibcCospiTest, SpecialNumbers) {
3434
}
3535

3636
TEST_F(LlvmLibcCospiTest, Integers) {
37-
EXPECT_FP_EQ(neg_zero, LIBC_NAMESPACE::cospi(-0x1.0000000000003p52));
3837

39-
EXPECT_FP_EQ(neg_zero, LIBC_NAMESPACE::cospi(-0x1.0000000000005p52));
38+
EXPECT_FP_EQ(FPBits::one(Sign::NEG).get_val(), LIBC_NAMESPACE::cospi(-0x1.8406003b2ae63p52));
4039

41-
EXPECT_FP_EQ(neg_zero, LIBC_NAMESPACE::cospi(-0x1.0000000000006p52));
40+
EXPECT_FP_EQ(FPBits::one().get_val(), LIBC_NAMESPACE::cospi(0x1p54));
4241

43-
EXPECT_FP_EQ(zero, LIBC_NAMESPACE::cospi(0x1.0000000000003p52));
42+
EXPECT_FP_EQ(FPBits::one().get_val(), LIBC_NAMESPACE::cospi(0x1p55));
4443

45-
EXPECT_FP_EQ(zero, LIBC_NAMESPACE::cospi(0x1.0000000000005p52));
46-
47-
EXPECT_FP_EQ(zero, LIBC_NAMESPACE::cospi(0x1.0000000000006p52));
44+
EXPECT_FP_EQ(FPBits::one().get_val(), LIBC_NAMESPACE::cospi(0x1p56));
4845
}

0 commit comments

Comments
 (0)