summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpommicket <pommicket@gmail.com>2022-01-12 09:59:34 -0500
committerpommicket <pommicket@gmail.com>2022-01-12 09:59:34 -0500
commit0d0455ce9232bdaafad0823967efa98f0431f141 (patch)
treea27212480902ed0bb8538c58ac514f7672f2d0f5
parentcbe358000183b0a66f719b93b52ba2ec292f8225 (diff)
better float idea
-rw-r--r--05/main.b7
-rw-r--r--05/tokenize.b25
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