Skip to content

Commit 9696dbd

Browse files
committed
fixup! [libc][math][c23] Add exp10m1f C23 math function
1 parent 9594a22 commit 9696dbd

File tree

4 files changed

+25
-9
lines changed

4 files changed

+25
-9
lines changed

libc/src/math/generic/exp10m1f.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ LLVM_LIBC_FUNCTION(float, exp10m1f, (float x)) {
134134
}
135135

136136
// When x <= log10(2^-25), or x is nan
137-
if (LIBC_UNLIKELY(x <= -0x1.e1a5e2p+2f)) {
137+
if (LIBC_UNLIKELY(x_u >= 0xc0f0d2f1)) {
138138
// exp10m1(-inf) = -1
139139
if (xbits.is_inf())
140140
return -1.0f;
@@ -144,7 +144,7 @@ LLVM_LIBC_FUNCTION(float, exp10m1f, (float x)) {
144144

145145
int rounding = fputil::quick_get_round();
146146
if (rounding == FE_UPWARD || rounding == FE_TOWARDZERO ||
147-
(rounding == FE_TONEAREST && x == -0x1.e1a5e2p+2f))
147+
(rounding == FE_TONEAREST && x_u == 0xc0f0d2f1))
148148
return -0x1.ffff'fep-1f; // -1.0f + 0x1.0p-24f
149149
150150
fputil::set_errno_if_required(ERANGE);

libc/test/UnitTest/FPMatcher.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ template <typename T> struct FPTest : public Test {
6868
LIBC_NAMESPACE::cpp::numeric_limits<StorageType>::max();
6969
static constexpr T zero = FPBits::zero(Sign::POS).get_val();
7070
static constexpr T neg_zero = FPBits::zero(Sign::NEG).get_val();
71-
static constexpr T aNaN = FPBits::quiet_nan().get_val();
71+
static constexpr T aNaN = FPBits::quiet_nan(Sign::POS).get_val();
72+
static constexpr T neg_aNaN = FPBits::quiet_nan(Sign::NEG).get_val();
7273
static constexpr T sNaN = FPBits::signaling_nan().get_val();
7374
static constexpr T inf = FPBits::inf(Sign::POS).get_val();
7475
static constexpr T neg_inf = FPBits::inf(Sign::NEG).get_val();

libc/test/src/math/exp10m1f_test.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ using LlvmLibcExp10m1fTest = LIBC_NAMESPACE::testing::FPTest<float>;
2121
namespace mpfr = LIBC_NAMESPACE::testing::mpfr;
2222

2323
TEST_F(LlvmLibcExp10m1fTest, TrickyInputs) {
24-
constexpr LIBC_NAMESPACE::cpp::array<float, 30> INPUTS = {
24+
constexpr LIBC_NAMESPACE::cpp::array<float, 39> INPUTS = {
2525
// EXP10M1F_EXCEPTS_LO
2626
0x1.0fe54ep-11f,
2727
0x1.80e6eap-11f,
@@ -54,6 +54,18 @@ TEST_F(LlvmLibcExp10m1fTest, TrickyInputs) {
5454
-0x1.08e42p-6f,
5555
-0x1.0cdc44p-5f,
5656
-0x1.ca4322p-5f,
57+
// Exceptional integers.
58+
8.0f,
59+
9.0f,
60+
10.0f,
61+
// Overflow boundaries.
62+
0x1.344134p+5f,
63+
0x1.344136p+5f,
64+
0x1.344138p+5f,
65+
// Underflow boundaries.
66+
-0x1.e1a5e0p+2f,
67+
-0x1.e1a5e2p+2f,
68+
-0x1.e1a5e4p+2f,
5769
};
5870

5971
for (float x : INPUTS) {

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

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ using LlvmLibcExp10m1fTest = LIBC_NAMESPACE::testing::FPTest<float>;
1616
TEST_F(LlvmLibcExp10m1fTest, SpecialNumbers) {
1717
LIBC_NAMESPACE::libc_errno = 0;
1818

19-
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::exp10m1f(aNaN));
19+
EXPECT_EQ(FPBits(aNaN).uintval(),
20+
FPBits(LIBC_NAMESPACE::exp10m1f(aNaN)).uintval());
21+
EXPECT_EQ(FPBits(neg_aNaN).uintval(),
22+
FPBits(LIBC_NAMESPACE::exp10m1f(neg_aNaN)).uintval());
2023
EXPECT_FP_EQ_ALL_ROUNDING(inf, LIBC_NAMESPACE::exp10m1f(inf));
2124
EXPECT_FP_EQ_ALL_ROUNDING(-1.0f, LIBC_NAMESPACE::exp10m1f(neg_inf));
2225
EXPECT_FP_EQ_ALL_ROUNDING(0.0f, LIBC_NAMESPACE::exp10m1f(0.0f));
@@ -34,20 +37,20 @@ TEST_F(LlvmLibcExp10m1fTest, Overflow) {
3437
FE_OVERFLOW);
3538
EXPECT_MATH_ERRNO(ERANGE);
3639

37-
EXPECT_FP_EQ_WITH_EXCEPTION(inf, LIBC_NAMESPACE::exp10m1f(128.0f),
40+
EXPECT_FP_EQ_WITH_EXCEPTION(inf, LIBC_NAMESPACE::exp10m1f(0x1.344136p+5),
3841
FE_OVERFLOW);
3942
EXPECT_MATH_ERRNO(ERANGE);
4043

41-
EXPECT_FP_EQ_WITH_EXCEPTION(inf, LIBC_NAMESPACE::exp10m1f(0x1.000002p+7f),
44+
EXPECT_FP_EQ_WITH_EXCEPTION(inf, LIBC_NAMESPACE::exp10m1f(0x1.344138p+5),
4245
FE_OVERFLOW);
4346
EXPECT_MATH_ERRNO(ERANGE);
4447
}
4548

4649
TEST_F(LlvmLibcExp10m1fTest, Underflow) {
4750
LIBC_NAMESPACE::libc_errno = 0;
4851

49-
EXPECT_FP_EQ_WITH_EXCEPTION(
50-
-1.0f, LIBC_NAMESPACE::exp10m1f(-0x1.fffffep+127f), FE_UNDERFLOW);
52+
EXPECT_FP_EQ_WITH_EXCEPTION(-1.0f, LIBC_NAMESPACE::exp10m1f(-max_normal),
53+
FE_UNDERFLOW);
5154
EXPECT_MATH_ERRNO(ERANGE);
5255

5356
EXPECT_FP_EQ_WITH_EXCEPTION(-1.0f, LIBC_NAMESPACE::exp10m1f(-0x1.e1a5e4p+2f),

0 commit comments

Comments
 (0)