stdlib: Fix hex-float printing for f80

This commit is contained in:
Cody Tapscott 2022-04-25 16:32:42 -07:00
parent d930e015c7
commit f5540778b5
2 changed files with 10 additions and 3 deletions

View File

@ -1124,6 +1124,7 @@ pub fn formatFloatHexadecimal(
const TU = std.meta.Int(.unsigned, std.meta.bitCount(T));
const mantissa_bits = math.floatMantissaBits(T);
const fractional_bits = math.floatFractionalBits(T);
const exponent_bits = math.floatExponentBits(T);
const mantissa_mask = (1 << mantissa_bits) - 1;
const exponent_mask = (1 << exponent_bits) - 1;
@ -1155,14 +1156,14 @@ pub fn formatFloatHexadecimal(
// Adjust the exponent for printing.
exponent += 1;
} else {
// Add the implicit 1.
mantissa |= 1 << mantissa_bits;
if (fractional_bits == mantissa_bits)
mantissa |= 1 << fractional_bits; // Add the implicit integer bit.
}
// Fill in zeroes to round the mantissa width to a multiple of 4.
if (T == f16) mantissa <<= 2 else if (T == f32) mantissa <<= 1;
const mantissa_digits = (mantissa_bits + 3) / 4;
const mantissa_digits = (fractional_bits + 3) / 4;
if (options.precision) |precision| {
// Round if needed.

View File

@ -9,6 +9,7 @@ pub fn signbit(x: anytype) bool {
f16 => signbit16(x),
f32 => signbit32(x),
f64 => signbit64(x),
f80 => signbit80(x),
f128 => signbit128(x),
else => @compileError("signbit not implemented for " ++ @typeName(T)),
};
@ -29,6 +30,11 @@ fn signbit64(x: f64) bool {
return bits >> 63 != 0;
}
fn signbit80(x: f80) bool {
const bits = @bitCast(u80, x);
return bits >> 79 != 0;
}
fn signbit128(x: f128) bool {
const bits = @bitCast(u128, x);
return bits >> 127 != 0;