authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-03-21 16:35:18-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-03-21 16:35:18-04:00
logd04a1456df996aa51dd5eb5857528ed4a237ca13
tree6f69a86696797ed91ef7ee95a1e63e5b68103074
parentaf509c68b01c8645e5efaeec7ea11e809f34ba7d
signaturelock-open Commit is signed but in an unrecognized format.

hex float parsing: solve another case

this works now: 0x1.edcb34a235253948765432134674fp-1

2 files changed, 11 insertions(+), 2 deletions(-)

src/tokenizer.cpp+3
......@@ -365,6 +365,9 @@ static void end_float_token(Tokenize *t) {
365365 bigint_init_unsigned(&shift_bigint, -shift);
366366 BigInt shifted_significand;
367367 bigint_shr(&shifted_significand, &t->significand, &shift_bigint);
368 if (t->exponent_in_bin_or_dec == -1) {
369 bigint_incr(&shifted_significand);
370 }
368371 bigint_write_twos_complement(&shifted_significand, (uint8_t*) f_bits.repr, 128, false);
369372 } else {
370373 uint64_t sig_bits[2] = {0, 0};
test/stage1/behavior/math.zig+8-2
......@@ -310,8 +310,14 @@ test "quad hex float literal parsing accurate" {
310310
311311 const S = struct {
312312 fn doTheTest() void {
313 var f1: f128 = 0x1.2eab345678439abcdefea56782346p+5;
314 expect(@bitCast(u128, f1) == 0x40042eab345678439abcdefea5678234);
313 {
314 var f1: f128 = 0x1.2eab345678439abcdefea56782346p+5;
315 expect(@bitCast(u128, f1) == 0x40042eab345678439abcdefea5678234);
316 }
317 {
318 var f: f128 = 0x1.edcb34a235253948765432134674fp-1;
319 expect(@bitCast(u128, f) == 0x3ffeedcb34a235253948765432134675);
320 }
315321 const exp2ft = []f64{
316322 0x1.6a09e667f3bcdp-1,
317323 0x1.7a11473eb0187p-1,