@@ -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
3041TEST (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
5061TEST (floating_point_utils, double_from_uint)
@@ -70,10 +81,11 @@ TEST(floating_point_utils, float_from_uint)
7081TEST (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)
8395TEST (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);
0 commit comments