Generate a namespace of tests for frexp on values of the given type
fn FrexpTests(comptime Float: type) type
fn FrexpTests(comptime Float: type) type {
return struct {
const T = Float;
test "normal" {
const epsilon = 1e-6;
var r: Frexp(T) = undefined;
r = frexp(@as(T, 1.3));
try expectApproxEqAbs(0.65, r.significand, epsilon);
try expectEqual(1, r.exponent);
r = frexp(@as(T, 78.0234));
try expectApproxEqAbs(0.609558, r.significand, epsilon);
try expectEqual(7, r.exponent);
r = frexp(@as(T, -1234.5678));
try expectEqual(11, r.exponent);
try expectApproxEqAbs(-0.602816, r.significand, epsilon);
}
test "max" {
const exponent = math.floatExponentMax(T) + 1;
const significand = 1.0 - math.floatEps(T) / 2;
const r: Frexp(T) = frexp(math.floatMax(T));
try expectEqual(exponent, r.exponent);
try expectEqual(significand, r.significand);
}
test "min" {
const exponent = math.floatExponentMin(T) + 1;
const r: Frexp(T) = frexp(math.floatMin(T));
try expectEqual(exponent, r.exponent);
try expectEqual(0.5, r.significand);
}
test "subnormal" {
const normal_min_exponent = math.floatExponentMin(T) + 1;
const exponent = normal_min_exponent - math.floatFractionalBits(T);
const r: Frexp(T) = frexp(math.floatTrueMin(T));
try expectEqual(exponent, r.exponent);
try expectEqual(0.5, r.significand);
}
test "zero" {
var r: Frexp(T) = undefined;
r = frexp(@as(T, 0.0));
try expectEqual(0, r.exponent);
try expect(math.isPositiveZero(r.significand));
r = frexp(@as(T, -0.0));
try expectEqual(0, r.exponent);
try expect(math.isNegativeZero(r.significand));
}
test "inf" {
var r: Frexp(T) = undefined;
r = frexp(math.inf(T));
try expectEqual(0, r.exponent);
try expect(math.isPositiveInf(r.significand));
r = frexp(-math.inf(T));
try expectEqual(0, r.exponent);
try expect(math.isNegativeInf(r.significand));
}
test "nan" {
const r: Frexp(T) = frexp(math.nan(T));
try expect(math.isNan(r.significand));
}
};
}