From f5540778b56636cffd89f794c6b1a9266d7d36f8 Mon Sep 17 00:00:00 2001 From: Cody Tapscott Date: Mon, 25 Apr 2022 16:32:42 -0700 Subject: [PATCH] stdlib: Fix hex-float printing for f80 --- lib/std/fmt.zig | 7 ++++--- lib/std/math/signbit.zig | 6 ++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/std/fmt.zig b/lib/std/fmt.zig index 80a2e87c5c..994350ffa7 100644 --- a/lib/std/fmt.zig +++ b/lib/std/fmt.zig @@ -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. diff --git a/lib/std/math/signbit.zig b/lib/std/math/signbit.zig index 056add5ae6..a72d6ab119 100644 --- a/lib/std/math/signbit.zig +++ b/lib/std/math/signbit.zig @@ -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;