diff options
-rw-r--r-- | 05/main.b | 7 | ||||
-rw-r--r-- | 05/tokenize.b | 25 |
2 files changed, 18 insertions, 14 deletions
@@ -68,7 +68,7 @@ function compile_warning ; ulong significand ; ulong exponent ; where for i = -1023..1023, powers_of_10 + 16*i points to an entry where -; (significand / 2^58) * 2^exponent +; 10^i = significand * 2^exponent global powers_of_10 #include util.b @@ -183,7 +183,7 @@ function fill_in_powers_of_10 powers_of_10 = malloc(40000) powers_of_10 += 20000 significand = 1 < 57 - exponent = 1 + exponent = -57 i = 0 :pow10_loop_positive p = powers_of_10 @@ -198,7 +198,7 @@ function fill_in_powers_of_10 i += 1 if i < 1024 goto pow10_loop_positive significand = 1 < 57 - exponent = 1 + exponent = -57 i = 0 :pow10_loop_negative p = powers_of_10 @@ -233,7 +233,6 @@ function print_powers_of_10 p = powers_of_10 p += i < 4 significand = *8p - putc('.) j = 57 :pow10_binary_loop b = significand > j diff --git a/05/tokenize.b b/05/tokenize.b index 850851f..4ad858b 100644 --- a/05/tokenize.b +++ b/05/tokenize.b @@ -283,12 +283,21 @@ function tokenize ; first, deal with the fractional part p = powers_of_10 p += pow10 < 4 - full_multiply_signed(fraction, *8p, &upper, &lower) - ; effectively we want the upper 58 bits of this multiplication - significand = lower > 58 - significand |= upper < 6 + full_multiply_signed(fraction, *8p, &lower, &upper) + if upper == 0 goto fmultiply_no_upper + n = leftmost_1bit(upper) + n += 1 + significand = lower > n + exponent += n + n = 64 - n + significand |= upper < n + goto fmultiply_cont + :fmultiply_no_upper + significand = lower + goto fmultiply_cont + :fmultiply_cont p += 8 - exponent = *8p + exponent += *8p putn(significand) putc(32) @@ -300,8 +309,7 @@ function tokenize n += 1 significand = right_shift(significand, n) exponent += n - n = 58 - exponent - significand += left_shift(integer, n) + significand += right_shift(integer, exponent) putn(significand) putc(32) putn_signed(exponent) @@ -320,9 +328,6 @@ function tokenize significand &= ~b data = significand exponent += 1023 ; float format - putc('*) - putn(exponent) - putc(10) data |= exponent < 52 |