Manually construct denormal constants in tests

Constructing these at runtime can cause them to be flushed to zero,
which was triggering a CI failure for Windows.
This commit is contained in:
Cody Tapscott 2022-10-09 17:12:31 -07:00
parent c9ecf7b920
commit 879fb0c57c

View File

@ -102,10 +102,16 @@ test "math.ldexp" {
try expect(ldexp(math.floatTrueMin(T), 0) > 0.0);
try expect(ldexp(math.floatTrueMin(T), -1) == 0.0);
// Multiplications might flush the denormals to zero, esp. at
// runtime, so we manually construct the constants here instead.
const Z = std.meta.Int(.unsigned, @bitSizeOf(T));
const EightTimesTrueMin = @bitCast(T, @as(Z, 8));
const TwoTimesTrueMin = @bitCast(T, @as(Z, 2));
// subnormals -> subnormals
try expect(ldexp(math.floatTrueMin(T), 3) == math.floatTrueMin(T) * 8);
try expect(ldexp(math.floatTrueMin(T) * 8, -2) == math.floatTrueMin(T) * 2);
try expect(ldexp(math.floatTrueMin(T) * 8, -3) == math.floatTrueMin(T));
try expect(ldexp(math.floatTrueMin(T), 3) == EightTimesTrueMin);
try expect(ldexp(EightTimesTrueMin, -2) == TwoTimesTrueMin);
try expect(ldexp(EightTimesTrueMin, -3) == math.floatTrueMin(T));
// subnormals -> normals (+)
try expect(ldexp(math.floatTrueMin(T), fractional_bits) == math.floatMin(T));