+TEST(FP16Test, NaN) {
+ // Ignore the sign bit.
+ EXPECT_EQ(0x7e00, fp64_to_fp16(0.0 / 0.0).val & 0x7fff);
+ EXPECT_TRUE(isnan(fp16_to_fp64(make_fp16(0xfe00))));
+
+ fp64 borderline_inf;
+ borderline_inf.ll = 0x7ff0000000000000ull;
+ fp64 borderline_nan;
+ borderline_nan.ll = 0x7ff0000000000001ull;
+
+ ASSERT_FALSE(isfinite(borderline_inf.f));
+ ASSERT_FALSE(isnan(borderline_inf.f));
+
+ ASSERT_FALSE(isfinite(borderline_nan.f));
+ ASSERT_TRUE(isnan(borderline_nan.f));
+
+ double borderline_inf_roundtrip = fp16_to_fp64(fp64_to_fp16(borderline_inf.f));
+ double borderline_nan_roundtrip = fp16_to_fp64(fp64_to_fp16(borderline_nan.f));
+
+ EXPECT_FALSE(isfinite(borderline_inf_roundtrip));
+ EXPECT_FALSE(isnan(borderline_inf_roundtrip));
+
+ EXPECT_FALSE(isfinite(borderline_nan_roundtrip));
+ EXPECT_TRUE(isnan(borderline_nan_roundtrip));
+}
+
+TEST(FP16Test, Denormals) {
+ const double smallest_fp16_denormal = 5.9604644775390625e-08;
+ EXPECT_EQ(0x0001, fp64_to_fp16(smallest_fp16_denormal).val);
+ EXPECT_EQ(0x0000, fp64_to_fp16(0.5 * smallest_fp16_denormal).val); // Round-to-even.
+ EXPECT_EQ(0x0001, fp64_to_fp16(0.51 * smallest_fp16_denormal).val);
+ EXPECT_EQ(0x0002, fp64_to_fp16(1.5 * smallest_fp16_denormal).val);
+
+ const double smallest_fp16_non_denormal = 6.103515625e-05;
+ EXPECT_EQ(0x0400, fp64_to_fp16(smallest_fp16_non_denormal).val);
+ EXPECT_EQ(0x0400, fp64_to_fp16(smallest_fp16_non_denormal - 0.5 * smallest_fp16_denormal).val); // Round-to-even.
+ EXPECT_EQ(0x03ff, fp64_to_fp16(smallest_fp16_non_denormal - smallest_fp16_denormal).val);
+}
+