From 0d0455ce9232bdaafad0823967efa98f0431f141 Mon Sep 17 00:00:00 2001
From: pommicket <pommicket@gmail.com>
Date: Wed, 12 Jan 2022 09:59:34 -0500
Subject: better float idea

---
 05/main.b     |  7 +++----
 05/tokenize.b | 25 +++++++++++++++----------
 2 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/05/main.b b/05/main.b
index db2ed2d..cda5847 100644
--- a/05/main.b
+++ b/05/main.b
@@ -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
 			
-- 
cgit v1.2.3