Skip to content

Commit 707f100

Browse files
committed
test: Separate implementation-defined NaN values
1 parent 1f52fe4 commit 707f100

2 files changed

Lines changed: 21 additions & 8 deletions

File tree

test/unittests/floating_point_utils_test.cpp

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,19 @@ TEST(floating_point_utils, double_as_uint)
2323
EXPECT_EQ(FP(-1.0).as_uint(), 0xBFF'0000000000000);
2424
EXPECT_EQ(FP(std::nextafter(1.0, 0.0)).as_uint(), 0x3FE'FFFFFFFFFFFFF);
2525
EXPECT_EQ(FP(std::nextafter(-1.0, 0.0)).as_uint(), 0xBFE'FFFFFFFFFFFFF);
26+
EXPECT_EQ(FP(FP64::nan(FP64::canon)).as_uint(), 0x7FF'8000000000000);
27+
EXPECT_EQ(FP(-FP64::nan(FP64::canon)).as_uint(), 0xFFF'8000000000000);
28+
}
29+
30+
TEST(floating_point_utils, binary_representation_implementation_defined)
31+
{
2632
EXPECT_EQ(FP(FP64::Limits::quiet_NaN()).as_uint(), 0x7FF'8000000000000);
27-
EXPECT_EQ(FP(-FP64::Limits::quiet_NaN()).as_uint(), 0xFFF'8000000000000);
33+
EXPECT_EQ(FP(FP64::Limits::quiet_NaN()).nan_payload(), 0x8000000000000);
34+
EXPECT_EQ(FP(FP64::Limits::signaling_NaN()).nan_payload(), 0x4000000000000);
35+
36+
EXPECT_EQ(FP(FP32::Limits::quiet_NaN()).as_uint(), 0x7FC00000);
37+
EXPECT_EQ(FP(FP32::Limits::quiet_NaN()).nan_payload(), 0x400000);
38+
EXPECT_EQ(FP(FP32::Limits::signaling_NaN()).nan_payload(), 0x200000);
2839
}
2940

3041
TEST(floating_point_utils, float_as_uint)
@@ -43,8 +54,8 @@ TEST(floating_point_utils, float_as_uint)
4354
EXPECT_EQ(FP(-1.0f).as_uint(), 0xBF800000);
4455
EXPECT_EQ(FP(std::nextafter(1.0f, 0.0f)).as_uint(), 0x3F7FFFFF);
4556
EXPECT_EQ(FP(std::nextafter(-1.0f, 0.0f)).as_uint(), 0xBF7FFFFF);
46-
EXPECT_EQ(FP(FP32::Limits::quiet_NaN()).as_uint(), 0x7FC00000);
47-
EXPECT_EQ(FP(-FP32::Limits::quiet_NaN()).as_uint(), 0xFFC00000);
57+
EXPECT_EQ(FP(FP32::nan(FP32::canon)).as_uint(), 0x7FC00000);
58+
EXPECT_EQ(FP(-FP32::nan(FP32::canon)).as_uint(), 0xFFC00000);
4859
}
4960

5061
TEST(floating_point_utils, double_from_uint)
@@ -70,10 +81,11 @@ TEST(floating_point_utils, float_from_uint)
7081
TEST(floating_point_utils, double_nan_payload)
7182
{
7283
constexpr auto inf = FP64::Limits::infinity();
73-
constexpr auto qnan = FP64::Limits::quiet_NaN();
84+
const auto qnan = FP64::nan(FP64::canon);
7485

7586
EXPECT_EQ(FP(0.0).nan_payload(), 0);
76-
EXPECT_EQ(FP(FP64::Limits::signaling_NaN()).nan_payload(), 0x4000000000000);
87+
EXPECT_EQ(FP(FP64::nan(1)).nan_payload(), 1);
88+
EXPECT_EQ(FP(FP64::nan(FP64::canon + 1)).nan_payload(), FP64::canon + 1);
7789
EXPECT_EQ(FP(qnan).nan_payload(), FP64::canon);
7890
EXPECT_EQ(FP(qnan + 1.0).nan_payload(), FP64::canon);
7991
EXPECT_EQ(FP(inf - inf).nan_payload(), FP64::canon);
@@ -83,10 +95,11 @@ TEST(floating_point_utils, double_nan_payload)
8395
TEST(floating_point_utils, float_nan_payload)
8496
{
8597
constexpr auto inf = FP32::Limits::infinity();
86-
constexpr auto qnan = FP32::Limits::quiet_NaN();
98+
const auto qnan = FP32::nan(FP32::canon);
8799

88100
EXPECT_EQ(FP(0.0f).nan_payload(), 0);
89-
EXPECT_EQ(FP(FP32::Limits::signaling_NaN()).nan_payload(), 0x200000);
101+
EXPECT_EQ(FP(FP32::nan(1)).nan_payload(), 1);
102+
EXPECT_EQ(FP(FP32::nan(FP32::canon + 1)).nan_payload(), FP32::canon + 1);
90103
EXPECT_EQ(FP(qnan).nan_payload(), FP32::canon);
91104
EXPECT_EQ(FP(qnan + 1.0f).nan_payload(), FP32::canon);
92105
EXPECT_EQ(FP(inf - inf).nan_payload(), FP32::canon);

test/utils/floating_point_utils.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ struct FP
8787
friend bool operator!=(T a, FP b) noexcept { return FP{a} != b; }
8888
};
8989

90-
FP(uint64_t)->FP<double>;
9190
FP(uint32_t)->FP<float>;
91+
FP(uint64_t)->FP<double>;
9292

9393
using FP32 = FP<float>;
9494
using FP64 = FP<double>;

0 commit comments

Comments
 (0)