From cbe358000183b0a66f719b93b52ba2ec292f8225 Mon Sep 17 00:00:00 2001 From: pommicket Date: Wed, 12 Jan 2022 09:45:20 -0500 Subject: bad float implementation --- 05/main.b | 1 + 05/tokenize.b | 25 ++++++++++++++++++++----- 05/util.b | 21 ++++++++++++++++++++- 3 files changed, 41 insertions(+), 6 deletions(-) (limited to '05') diff --git a/05/main.b b/05/main.b index b247584..db2ed2d 100644 --- a/05/main.b +++ b/05/main.b @@ -88,6 +88,7 @@ function main local tokens fill_in_powers_of_10() + print_powers_of_10() dat_banned_objmacros = 255 dat_banned_fmacros = 255 diff --git a/05/tokenize.b b/05/tokenize.b index 5f87c71..850851f 100644 --- a/05/tokenize.b +++ b/05/tokenize.b @@ -288,18 +288,29 @@ function tokenize significand = lower > 58 significand |= upper < 6 p += 8 - significand >= 0 - *8p + exponent = *8p + + putn(significand) + putc(32) + putn_signed(exponent) + putc(10) if integer == 0 goto float_no_integer - ; we now have significand / 2^58 = fraction*10^pow10 ; now deal with the integer part - exponent = leftmost_1bit(integer) - significand >= exponent + n = leftmost_1bit(integer) + n += 1 + significand = right_shift(significand, n) + exponent += n n = 58 - exponent - significand += integer < n + significand += left_shift(integer, n) + putn(significand) + putc(32) + putn_signed(exponent) + putc(10) if *1in != 'e goto float_no_exponent :float_no_exponent if significand == 0 goto float_zero + normalize_float(&significand, &exponent) ; reduce to 52-bit significant significand >= 6 exponent += 6 @@ -309,6 +320,10 @@ function tokenize significand &= ~b data = significand exponent += 1023 ; float format + putc('*) + putn(exponent) + putc(10) + data |= exponent < 52 *1out = TOKEN_CONSTANT_FLOAT diff --git a/05/util.b b/05/util.b index fc1aa1e..138e440 100644 --- a/05/util.b +++ b/05/util.b @@ -24,7 +24,26 @@ function full_multiply_signed *8p_lower = lower *8p_upper = upper return - + +; allows for negative shifts +function right_shift + argument x + argument n + if n < 0 goto right_shift_negative + return x > n + :right_shift_negative + n = 0 - n + return x < n + +; allows for negative shifts +function left_shift + argument x + argument n + if n < 0 goto right_shift_negative + return x < n + :left_shift_negative + n = 0 - n + return x > n function file_error argument name -- cgit v1.2.3