From d04a1456df996aa51dd5eb5857528ed4a237ca13 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 21 Mar 2019 16:35:18 -0400 Subject: [PATCH] hex float parsing: solve another case this works now: 0x1.edcb34a235253948765432134674fp-1 --- src/tokenizer.cpp | 3 +++ test/stage1/behavior/math.zig | 10 ++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/tokenizer.cpp b/src/tokenizer.cpp index 07ea4bf55a..a535d15680 100644 --- a/src/tokenizer.cpp +++ b/src/tokenizer.cpp @@ -365,6 +365,9 @@ static void end_float_token(Tokenize *t) { bigint_init_unsigned(&shift_bigint, -shift); BigInt shifted_significand; bigint_shr(&shifted_significand, &t->significand, &shift_bigint); + if (t->exponent_in_bin_or_dec == -1) { + bigint_incr(&shifted_significand); + } bigint_write_twos_complement(&shifted_significand, (uint8_t*) f_bits.repr, 128, false); } else { uint64_t sig_bits[2] = {0, 0}; diff --git a/test/stage1/behavior/math.zig b/test/stage1/behavior/math.zig index 97ec8232d8..235ea1dbf6 100644 --- a/test/stage1/behavior/math.zig +++ b/test/stage1/behavior/math.zig @@ -310,8 +310,14 @@ test "quad hex float literal parsing accurate" { const S = struct { fn doTheTest() void { - var f1: f128 = 0x1.2eab345678439abcdefea56782346p+5; - expect(@bitCast(u128, f1) == 0x40042eab345678439abcdefea5678234); + { + var f1: f128 = 0x1.2eab345678439abcdefea56782346p+5; + expect(@bitCast(u128, f1) == 0x40042eab345678439abcdefea5678234); + } + { + var f: f128 = 0x1.edcb34a235253948765432134674fp-1; + expect(@bitCast(u128, f) == 0x3ffeedcb34a235253948765432134675); + } const exp2ft = []f64{ 0x1.6a09e667f3bcdp-1, 0x1.7a11473eb0187p-1,