4 #include <gtest/gtest.h>
8 TEST(FP16Test, Simple) {
9 EXPECT_EQ(0x0000, fp64_to_fp16(0.0));
10 EXPECT_DOUBLE_EQ(0.0, fp16_to_fp64(0x0000));
12 EXPECT_EQ(0x3c00, fp64_to_fp16(1.0));
13 EXPECT_DOUBLE_EQ(1.0, fp16_to_fp64(0x3c00));
15 EXPECT_EQ(0x3555, fp64_to_fp16(1.0 / 3.0));
16 EXPECT_DOUBLE_EQ(0.333251953125, fp16_to_fp64(0x3555));
20 EXPECT_EQ(0xfe00, fp64_to_fp16(0.0 / 0.0));
21 EXPECT_TRUE(isnan(fp16_to_fp64(0xfe00)));
26 unsigned long long ll;
33 // Randomly test a large number of fp64 -> fp32 conversions, comparing
35 TEST(FP16Test, FP32ReferenceDownconvert) {
38 for (int i = 0; i < 1000000; ++i) {
43 union fp32 reference, result;
45 src.ll = (((unsigned long long)r1) << 33) ^ ((unsigned long long)r2 << 16) ^ r3;
46 reference.f = float(src.f);
47 result.u = fp64_to_fp32(src.f);
49 EXPECT_EQ(isnan(result.f), isnan(reference.f));
50 if (!isnan(result.f)) {
51 EXPECT_EQ(result.u, reference.u)
52 << src.f << " got rounded to " << result.u << " (" << result.f << ")";
57 // Randomly test a large number of fp32 -> fp64 conversions, comparing
59 TEST(FP16Test, FP32ReferenceUpconvert) {
62 for (int i = 0; i < 1000000; ++i) {
66 union fp64 reference, result;
68 src.u = ((unsigned long long)r1 << 16) ^ r2;
69 reference.f = double(src.f);
70 result.f = fp32_to_fp64(src.u);
72 EXPECT_EQ(isnan(result.f), isnan(reference.f));
73 if (!isnan(result.f)) {
74 EXPECT_EQ(result.ll, reference.ll)
75 << src.f << " got converted to " << result.ll << " (" << result.f << ")";