Skip to content

Commit 771d9ab

Browse files
authored
[libc][math] Fix subtraction of infinity in fputil::add_or_sub (#152017)
Signed-off-by: Krishna Pandey <[email protected]>
1 parent 5187038 commit 771d9ab

File tree

3 files changed

+14
-2
lines changed

3 files changed

+14
-2
lines changed

libc/src/__support/FPUtil/generic/add_sub.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,12 @@ add_or_sub(InType x, InType y) {
8787
return OutFPBits::inf(x_bits.sign()).get_val();
8888
}
8989

90-
if (y_bits.is_inf())
91-
return OutFPBits::inf(y_bits.sign()).get_val();
90+
if (y_bits.is_inf()) {
91+
if constexpr (IsSub)
92+
return OutFPBits::inf(y_bits.sign().negate()).get_val();
93+
else
94+
return OutFPBits::inf(y_bits.sign()).get_val();
95+
}
9296

9397
if (x_bits.is_zero()) {
9498
if (y_bits.is_zero()) {

libc/test/src/math/smoke/AddTest.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ class AddTest : public LIBC_NAMESPACE::testing::FEnvSafeTest {
4747
EXPECT_FP_EQ(neg_inf, func(in.neg_inf, in.zero));
4848
EXPECT_FP_EQ(inf, func(in.inf, in.neg_zero));
4949
EXPECT_FP_EQ(neg_inf, func(in.neg_inf, in.neg_zero));
50+
EXPECT_FP_EQ(inf, func(in.zero, in.inf));
51+
EXPECT_FP_EQ(inf, func(in.neg_zero, in.inf));
52+
EXPECT_FP_EQ(neg_inf, func(in.zero, in.neg_inf));
53+
EXPECT_FP_EQ(neg_inf, func(in.neg_zero, in.neg_inf));
5054
}
5155

5256
void test_invalid_operations(AddFunc func) {

libc/test/src/math/smoke/SubTest.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ class SubTest : public LIBC_NAMESPACE::testing::FEnvSafeTest {
4747
EXPECT_FP_EQ(neg_inf, func(in.neg_inf, in.zero));
4848
EXPECT_FP_EQ(inf, func(in.inf, in.neg_zero));
4949
EXPECT_FP_EQ(neg_inf, func(in.neg_inf, in.neg_zero));
50+
EXPECT_FP_EQ(neg_inf, func(in.zero, in.inf));
51+
EXPECT_FP_EQ(neg_inf, func(in.neg_zero, in.inf));
52+
EXPECT_FP_EQ(inf, func(in.zero, in.neg_inf));
53+
EXPECT_FP_EQ(inf, func(in.neg_zero, in.neg_inf));
5054
}
5155

5256
void test_invalid_operations(SubFunc func) {

0 commit comments

Comments
 (0)