@@ -202,18 +202,19 @@ pub fn parseHexFloat(comptime T: type, s: []const u8) !T {
202
202
exponent += 1 ;
203
203
}
204
204
205
- // There are two cases to handle:
206
- // - We've truncated more than 0.5ULP (R=S=1), increase the mantissa.
207
- // - We've truncated exactly 0.5ULP (R=1 S=0), increase the mantissa if the
208
- // result is odd (G=1).
209
- // The two checks can be neatly folded as follows.
210
- mantissa |= @boolToInt (mantissa & 0b100 != 0 );
211
- mantissa += 1 ;
212
-
205
+ // Whenever the guard bit is one (G=1) and:
206
+ // - we've truncated more than 0.5ULP (R=S=1)
207
+ // - we've truncated exactly 0.5ULP (R=1 S=0)
208
+ // Were are going to increase the mantissa (round up)
209
+ const guard_bit_and_half_or_more = (mantissa & 0b110 ) == 0b110 ;
213
210
mantissa >>= 2 ;
214
211
exponent += 2 ;
215
212
216
- if (mantissa & (1 << (mantissa_bits + 1 )) != 0 ) {
213
+ if (guard_bit_and_half_or_more ) {
214
+ mantissa += 1 ;
215
+ }
216
+
217
+ if (mantissa == (1 << (mantissa_bits + 1 ))) {
217
218
// Renormalize, if the exponent overflows we'll catch that below.
218
219
mantissa >>= 1 ;
219
220
exponent += 1 ;
@@ -338,6 +339,7 @@ test "f128" {
338
339
// // Min denormalized value.
339
340
.{ .s = "0x1p-16494" , .v = math .f128_true_min },
340
341
.{ .s = "-0x1p-16494" , .v = - math .f128_true_min },
342
+ .{ .s = "0x1.edcb34a235253948765432134674fp-1" , .v = 0x1.edcb34a235253948765432134674fp-1 },
341
343
};
342
344
343
345
for (cases ) | case | {
0 commit comments