- 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);
-}
-
-// Randomly test a large number of fp64 -> fp32 conversions, comparing
-// against the FPU.
-TEST(FP16Test, FP32ReferenceDownconvert) {
- srand(12345);
-
- for (int i = 0; i < 1000000; ++i) {
- unsigned r1 = rand();
- unsigned r2 = rand();
- unsigned r3 = rand();
- union fp64 src;
- union fp32 reference, result;
-
- src.ll = (((unsigned long long)r1) << 33) ^ ((unsigned long long)r2 << 16) ^ r3;
- reference.f = float(src.f);
- result.u = fp64_to_fp32(src.f).val;
-
- EXPECT_EQ(isnan(result.f), isnan(reference.f));
- if (!isnan(result.f)) {
- EXPECT_EQ(result.u, reference.u)
- << src.f << " got rounded to " << result.u << " (" << result.f << ")";
- }
- }
-}
-
-// Randomly test a large number of fp32 -> fp64 conversions, comparing
-// against the FPU.
-TEST(FP16Test, FP32ReferenceUpconvert) {
- srand(12345);
-
- for (int i = 0; i < 1000000; ++i) {
- unsigned r1 = rand();
- unsigned r2 = rand();
- union fp32 src;
- union fp64 reference, result;
-
- src.u = ((unsigned long long)r1 << 16) ^ r2;
- reference.f = double(src.f);
- result.f = fp32_to_fp64(make_fp32(src.u));
-
- EXPECT_EQ(isnan(result.f), isnan(reference.f));
- if (!isnan(result.f)) {
- EXPECT_EQ(result.ll, reference.ll)
- << src.f << " got converted to " << result.ll << " (" << result.f << ")";
- }
- }
+ EXPECT_EQ(0x0400, fp32_to_fp16(smallest_fp16_non_denormal).val);
+ EXPECT_EQ(0x0400, fp32_to_fp16(smallest_fp16_non_denormal - 0.5 * smallest_fp16_denormal).val); // Round-to-even.
+ EXPECT_EQ(0x03ff, fp32_to_fp16(smallest_fp16_non_denormal - smallest_fp16_denormal).val);