std.fmt.parseFloat: add f80 formatFloat support
This commit is contained in:
committed by
Marc Tiehuis
parent
959d227d13
commit
8ff01f78f3
@@ -21,10 +21,6 @@ pub fn parseFloat(comptime T: type, s: []const u8) ParseFloatError!T {
|
||||
@compileError("Cannot parse a float into a non-floating point type.");
|
||||
}
|
||||
|
||||
if (T == f80) {
|
||||
@compileError("TODO support parsing float to f80");
|
||||
}
|
||||
|
||||
if (s.len == 0) {
|
||||
return error.InvalidCharacter;
|
||||
}
|
||||
@@ -75,7 +71,7 @@ pub fn parseFloat(comptime T: type, s: []const u8) ParseFloatError!T {
|
||||
// See https://github.com/tiehuis/parse-number-fxx-test-data for a wider-selection of test-data.
|
||||
|
||||
test parseFloat {
|
||||
inline for ([_]type{ f16, f32, f64, f128 }) |T| {
|
||||
inline for ([_]type{ f16, f32, f64, f80, f128 }) |T| {
|
||||
try testing.expectError(error.InvalidCharacter, parseFloat(T, ""));
|
||||
try testing.expectError(error.InvalidCharacter, parseFloat(T, " 1"));
|
||||
try testing.expectError(error.InvalidCharacter, parseFloat(T, "1abc"));
|
||||
@@ -131,7 +127,7 @@ test parseFloat {
|
||||
}
|
||||
|
||||
test "nan and inf" {
|
||||
inline for ([_]type{ f16, f32, f64, f128 }) |T| {
|
||||
inline for ([_]type{ f16, f32, f64, f80, f128 }) |T| {
|
||||
const Z = std.meta.Int(.unsigned, @typeInfo(T).Float.bits);
|
||||
|
||||
try expectEqual(@as(Z, @bitCast(try parseFloat(T, "nAn"))), @as(Z, @bitCast(std.math.nan(T))));
|
||||
@@ -144,6 +140,7 @@ test "largest normals" {
|
||||
try expectEqual(@as(u16, @bitCast(try parseFloat(f16, "65504"))), 0x7bff);
|
||||
try expectEqual(@as(u32, @bitCast(try parseFloat(f32, "3.4028234664E38"))), 0x7f7f_ffff);
|
||||
try expectEqual(@as(u64, @bitCast(try parseFloat(f64, "1.7976931348623157E308"))), 0x7fef_ffff_ffff_ffff);
|
||||
try expectEqual(@as(u80, @bitCast(try parseFloat(f80, "1.189731495357231765E4932"))), 0x7ffe_ffff_ffff_ffff_ffff);
|
||||
try expectEqual(@as(u128, @bitCast(try parseFloat(f128, "1.1897314953572317650857593266280070162E4932"))), 0x7ffe_ffff_ffff_ffff_ffff_ffff_ffff_ffff);
|
||||
}
|
||||
|
||||
@@ -152,8 +149,8 @@ test "#11169" {
|
||||
}
|
||||
|
||||
test "many_digits hex" {
|
||||
const a: f32 = try std.fmt.parseFloat(f32, "0xffffffffffffffff.0p0");
|
||||
const b: f32 = @floatCast(try std.fmt.parseFloat(f128, "0xffffffffffffffff.0p0"));
|
||||
const a: f32 = try parseFloat(f32, "0xffffffffffffffff.0p0");
|
||||
const b: f32 = @floatCast(try parseFloat(f128, "0xffffffffffffffff.0p0"));
|
||||
try std.testing.expectEqual(a, b);
|
||||
}
|
||||
|
||||
@@ -163,6 +160,7 @@ test "hex.special" {
|
||||
try testing.expect(math.isPositiveInf(try parseFloat(f32, "+Inf")));
|
||||
try testing.expect(math.isNegativeInf(try parseFloat(f32, "-iNf")));
|
||||
}
|
||||
|
||||
test "hex.zero" {
|
||||
try testing.expectEqual(@as(f32, 0.0), try parseFloat(f32, "0x0"));
|
||||
try testing.expectEqual(@as(f32, 0.0), try parseFloat(f32, "-0x0"));
|
||||
@@ -221,6 +219,23 @@ test "hex.f64" {
|
||||
try testing.expectEqual(try parseFloat(f64, "0x1p-1074"), math.floatTrueMin(f64));
|
||||
try testing.expectEqual(try parseFloat(f64, "-0x1p-1074"), -math.floatTrueMin(f64));
|
||||
}
|
||||
|
||||
test "hex.f80" {
|
||||
try testing.expectEqual(try parseFloat(f80, "0x1p0"), 1.0);
|
||||
try testing.expectEqual(try parseFloat(f80, "-0x1p-1"), -0.5);
|
||||
try testing.expectEqual(try parseFloat(f80, "0x10p+10"), 16384.0);
|
||||
try testing.expectEqual(try parseFloat(f80, "0x10p-10"), 0.015625);
|
||||
// Max normalized value.
|
||||
try testing.expectEqual(try parseFloat(f80, "0xf.fffffffffffffff7p+16380"), math.floatMax(f80));
|
||||
try testing.expectEqual(try parseFloat(f80, "-0xf.fffffffffffffff7p+16380"), -math.floatMax(f80));
|
||||
// Min normalized value.
|
||||
try testing.expectEqual(try parseFloat(f80, "0x1p-16382"), math.floatMin(f80));
|
||||
try testing.expectEqual(try parseFloat(f80, "-0x1p-16382"), -math.floatMin(f80));
|
||||
// Min denormalized value.
|
||||
try testing.expectEqual(try parseFloat(f80, "0x1p-16445"), math.floatTrueMin(f80));
|
||||
try testing.expectEqual(try parseFloat(f80, "-0x1p-16445"), -math.floatTrueMin(f80));
|
||||
}
|
||||
|
||||
test "hex.f128" {
|
||||
try testing.expectEqual(try parseFloat(f128, "0x1p0"), 1.0);
|
||||
try testing.expectEqual(try parseFloat(f128, "-0x1p-1"), -0.5);
|
||||
@@ -232,7 +247,7 @@ test "hex.f128" {
|
||||
// Min normalized value.
|
||||
try testing.expectEqual(try parseFloat(f128, "0x1p-16382"), math.floatMin(f128));
|
||||
try testing.expectEqual(try parseFloat(f128, "-0x1p-16382"), -math.floatMin(f128));
|
||||
// // Min denormalized value.
|
||||
// Min denormalized value.
|
||||
try testing.expectEqual(try parseFloat(f128, "0x1p-16494"), math.floatTrueMin(f128));
|
||||
try testing.expectEqual(try parseFloat(f128, "-0x1p-16494"), -math.floatTrueMin(f128));
|
||||
// ensure round-to-even
|
||||
|
||||
Reference in New Issue
Block a user