Skip to content

Commit 18fd6df

Browse files
authored
[libc][math] Add unit tests for raising excepts in nextafter (#73556)
Follow up to #72763 (comment). ### Summary - Add unit tests for raising excepts in `nextafter`. - Fixed a bug in testing code for `nexttoward`. cc: @lntue
1 parent e2d60c8 commit 18fd6df

File tree

2 files changed

+31
-18
lines changed

2 files changed

+31
-18
lines changed

libc/test/UnitTest/FPMatcher.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,15 +143,17 @@ template <typename T> struct FPTest : public Test {
143143
#define EXPECT_FP_EXCEPTION(expected) \
144144
do { \
145145
if (math_errhandling & MATH_ERREXCEPT) { \
146-
EXPECT_GE(LIBC_NAMESPACE::fputil::test_except(FE_ALL_EXCEPT) & expected, \
146+
EXPECT_GE(LIBC_NAMESPACE::fputil::test_except(FE_ALL_EXCEPT) & \
147+
(expected), \
147148
expected); \
148149
} \
149150
} while (0)
150151

151152
#define ASSERT_FP_EXCEPTION(expected) \
152153
do { \
153154
if (math_errhandling & MATH_ERREXCEPT) { \
154-
ASSERT_GE(LIBC_NAMESPACE::fputil::test_except(FE_ALL_EXCEPT) & expected, \
155+
ASSERT_GE(LIBC_NAMESPACE::fputil::test_except(FE_ALL_EXCEPT) & \
156+
(expected), \
155157
expected); \
156158
} \
157159
} while (0)
@@ -162,7 +164,7 @@ template <typename T> struct FPTest : public Test {
162164
EXPECT_FP_EQ(expected_val, actual_val); \
163165
if (math_errhandling & MATH_ERREXCEPT) { \
164166
EXPECT_GE(LIBC_NAMESPACE::fputil::test_except(FE_ALL_EXCEPT) & \
165-
expected_except, \
167+
(expected_except), \
166168
expected_except); \
167169
LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT); \
168170
} \
@@ -174,7 +176,7 @@ template <typename T> struct FPTest : public Test {
174176
EXPECT_FP_IS_NAN(actual_val); \
175177
if (math_errhandling & MATH_ERREXCEPT) { \
176178
EXPECT_GE(LIBC_NAMESPACE::fputil::test_except(FE_ALL_EXCEPT) & \
177-
expected_except, \
179+
(expected_except), \
178180
expected_except); \
179181
LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT); \
180182
} \

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

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,17 @@
1717
#include "test/UnitTest/Test.h"
1818
#include <math.h>
1919

20+
#define ASSERT_FP_EQ_WITH_EXCEPTION(result, expected, expected_exception) \
21+
ASSERT_FP_EQ(result, expected); \
22+
ASSERT_FP_EXCEPTION(expected_exception); \
23+
LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT)
24+
25+
#define ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected) \
26+
ASSERT_FP_EQ_WITH_EXCEPTION(result, expected, FE_INEXACT | FE_UNDERFLOW)
27+
28+
#define ASSERT_FP_EQ_WITH_OVERFLOW(result, expected) \
29+
ASSERT_FP_EQ_WITH_EXCEPTION(result, expected, FE_INEXACT | FE_OVERFLOW)
30+
2031
template <typename T>
2132
class NextAfterTestTemplate : public LIBC_NAMESPACE::testing::Test {
2233
using FPBits = LIBC_NAMESPACE::fputil::FPBits<T>;
@@ -53,23 +64,23 @@ class NextAfterTestTemplate : public LIBC_NAMESPACE::testing::Test {
5364
T result = func(x, T(1));
5465
UIntType expected_bits = 1;
5566
T expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
56-
ASSERT_FP_EQ(result, expected);
67+
ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected);
5768

5869
result = func(x, T(-1));
5970
expected_bits = (UIntType(1) << (BIT_WIDTH_OF_TYPE - 1)) + 1;
6071
expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
61-
ASSERT_FP_EQ(result, expected);
72+
ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected);
6273

6374
x = neg_zero;
6475
result = func(x, 1);
6576
expected_bits = 1;
6677
expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
67-
ASSERT_FP_EQ(result, expected);
78+
ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected);
6879

6980
result = func(x, -1);
7081
expected_bits = (UIntType(1) << (BIT_WIDTH_OF_TYPE - 1)) + 1;
7182
expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
72-
ASSERT_FP_EQ(result, expected);
83+
ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected);
7384

7485
// 'from' is max subnormal value.
7586
x = LIBC_NAMESPACE::cpp::bit_cast<T>(max_subnormal);
@@ -80,7 +91,7 @@ class NextAfterTestTemplate : public LIBC_NAMESPACE::testing::Test {
8091
result = func(x, 0);
8192
expected_bits = max_subnormal - 1;
8293
expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
83-
ASSERT_FP_EQ(result, expected);
94+
ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected);
8495

8596
x = -x;
8697

@@ -93,30 +104,30 @@ class NextAfterTestTemplate : public LIBC_NAMESPACE::testing::Test {
93104
expected_bits =
94105
(UIntType(1) << (BIT_WIDTH_OF_TYPE - 1)) + max_subnormal - 1;
95106
expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
96-
ASSERT_FP_EQ(result, expected);
107+
ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected);
97108

98109
// 'from' is min subnormal value.
99110
x = LIBC_NAMESPACE::cpp::bit_cast<T>(min_subnormal);
100111
result = func(x, 1);
101112
expected_bits = min_subnormal + 1;
102113
expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
103-
ASSERT_FP_EQ(result, expected);
104-
ASSERT_FP_EQ(func(x, 0), 0);
114+
ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected);
115+
ASSERT_FP_EQ_WITH_UNDERFLOW(func(x, 0), 0);
105116

106117
x = -x;
107118
result = func(x, -1);
108119
expected_bits =
109120
(UIntType(1) << (BIT_WIDTH_OF_TYPE - 1)) + min_subnormal + 1;
110121
expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
111-
ASSERT_FP_EQ(result, expected);
112-
ASSERT_FP_EQ(func(x, 0), T(-0.0));
122+
ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected);
123+
ASSERT_FP_EQ_WITH_UNDERFLOW(func(x, 0), T(-0.0));
113124

114125
// 'from' is min normal.
115126
x = LIBC_NAMESPACE::cpp::bit_cast<T>(min_normal);
116127
result = func(x, 0);
117128
expected_bits = max_subnormal;
118129
expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
119-
ASSERT_FP_EQ(result, expected);
130+
ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected);
120131

121132
result = func(x, inf);
122133
expected_bits = min_normal + 1;
@@ -127,7 +138,7 @@ class NextAfterTestTemplate : public LIBC_NAMESPACE::testing::Test {
127138
result = func(x, 0);
128139
expected_bits = (UIntType(1) << (BIT_WIDTH_OF_TYPE - 1)) + max_subnormal;
129140
expected = LIBC_NAMESPACE::cpp::bit_cast<T>(expected_bits);
130-
ASSERT_FP_EQ(result, expected);
141+
ASSERT_FP_EQ_WITH_UNDERFLOW(result, expected);
131142

132143
result = func(x, -inf);
133144
expected_bits = (UIntType(1) << (BIT_WIDTH_OF_TYPE - 1)) + min_normal + 1;
@@ -137,10 +148,10 @@ class NextAfterTestTemplate : public LIBC_NAMESPACE::testing::Test {
137148
// 'from' is max normal and 'to' is infinity.
138149
x = LIBC_NAMESPACE::cpp::bit_cast<T>(max_normal);
139150
result = func(x, inf);
140-
ASSERT_FP_EQ(result, inf);
151+
ASSERT_FP_EQ_WITH_OVERFLOW(result, inf);
141152

142153
result = func(-x, -inf);
143-
ASSERT_FP_EQ(result, -inf);
154+
ASSERT_FP_EQ_WITH_OVERFLOW(result, -inf);
144155

145156
// 'from' is infinity.
146157
x = inf;

0 commit comments

Comments
 (0)