powers of 10
This commit is contained in:
parent
f8f044a7a2
commit
c42cf36dee
2 changed files with 133 additions and 1 deletions
112
05/main.b
112
05/main.b
|
@ -64,6 +64,13 @@ function compile_warning
|
||||||
byte 32
|
byte 32
|
||||||
byte 0
|
byte 0
|
||||||
|
|
||||||
|
; powers of 10, stored in the following format:
|
||||||
|
; ulong significand
|
||||||
|
; ulong exponent
|
||||||
|
; where for i = -1023..1023, powers_of_10 + 16*i points to an entry where
|
||||||
|
; (significand / 2^58) * 2^exponent
|
||||||
|
global powers_of_10
|
||||||
|
|
||||||
#include util.b
|
#include util.b
|
||||||
#include constants.b
|
#include constants.b
|
||||||
#include preprocess.b
|
#include preprocess.b
|
||||||
|
@ -80,6 +87,8 @@ function main
|
||||||
local processed_pptokens
|
local processed_pptokens
|
||||||
local tokens
|
local tokens
|
||||||
|
|
||||||
|
fill_in_powers_of_10()
|
||||||
|
print_powers_of_10()
|
||||||
|
|
||||||
dat_banned_objmacros = 255
|
dat_banned_objmacros = 255
|
||||||
dat_banned_fmacros = 255
|
dat_banned_fmacros = 255
|
||||||
|
@ -132,3 +141,106 @@ function main
|
||||||
:str_default_output_filename
|
:str_default_output_filename
|
||||||
string a.out
|
string a.out
|
||||||
byte 0
|
byte 0
|
||||||
|
|
||||||
|
function normalize_float
|
||||||
|
argument p_significand
|
||||||
|
argument p_exponent
|
||||||
|
local significand
|
||||||
|
local exponent
|
||||||
|
|
||||||
|
significand = *8p_significand
|
||||||
|
exponent = *8p_exponent
|
||||||
|
|
||||||
|
:float_reduce_loop
|
||||||
|
if significand [ 0x400000000000000 goto float_reduce_loop_end
|
||||||
|
significand >= 1
|
||||||
|
exponent += 1
|
||||||
|
goto float_reduce_loop
|
||||||
|
:float_reduce_loop_end
|
||||||
|
:float_increase_loop
|
||||||
|
if significand ]= 0x200000000000000 goto float_increase_loop_end
|
||||||
|
significand <= 1
|
||||||
|
exponent -= 1
|
||||||
|
goto float_increase_loop
|
||||||
|
:float_increase_loop_end
|
||||||
|
*8p_significand = significand
|
||||||
|
*8p_exponent = exponent
|
||||||
|
return
|
||||||
|
|
||||||
|
function fill_in_powers_of_10
|
||||||
|
local i
|
||||||
|
local p
|
||||||
|
local significand
|
||||||
|
local exponent
|
||||||
|
powers_of_10 = malloc(40000)
|
||||||
|
powers_of_10 += 20000
|
||||||
|
significand = 1 < 57
|
||||||
|
exponent = 1
|
||||||
|
i = 0
|
||||||
|
:pow10_loop_positive
|
||||||
|
p = powers_of_10
|
||||||
|
p += i < 4
|
||||||
|
*8p = significand
|
||||||
|
p += 8
|
||||||
|
*8p = exponent
|
||||||
|
|
||||||
|
significand *= 10
|
||||||
|
normalize_float(&significand, &exponent)
|
||||||
|
|
||||||
|
i += 1
|
||||||
|
if i < 1024 goto pow10_loop_positive
|
||||||
|
significand = 1 < 57
|
||||||
|
exponent = 1
|
||||||
|
i = 0
|
||||||
|
:pow10_loop_negative
|
||||||
|
p = powers_of_10
|
||||||
|
p += i < 4
|
||||||
|
*8p = significand
|
||||||
|
p += 8
|
||||||
|
*8p = exponent
|
||||||
|
|
||||||
|
significand *= 32
|
||||||
|
exponent -= 5
|
||||||
|
significand /= 10
|
||||||
|
normalize_float(&significand, &exponent)
|
||||||
|
|
||||||
|
i -= 1
|
||||||
|
if i > -1024 goto pow10_loop_negative
|
||||||
|
return
|
||||||
|
|
||||||
|
function print_powers_of_10
|
||||||
|
local i
|
||||||
|
local j
|
||||||
|
local b
|
||||||
|
local p
|
||||||
|
local significand
|
||||||
|
i = -325
|
||||||
|
:print_powers_of_10_loop
|
||||||
|
putc(49)
|
||||||
|
putc(48)
|
||||||
|
putc('^)
|
||||||
|
putn_signed(i)
|
||||||
|
putc(61)
|
||||||
|
|
||||||
|
p = powers_of_10
|
||||||
|
p += i < 4
|
||||||
|
significand = *8p
|
||||||
|
putc('.)
|
||||||
|
j = 57
|
||||||
|
:pow10_binary_loop
|
||||||
|
b = significand > j
|
||||||
|
b &= 1
|
||||||
|
b += '0
|
||||||
|
putc(b)
|
||||||
|
j -= 1
|
||||||
|
if j >= 0 goto pow10_binary_loop
|
||||||
|
putc('*)
|
||||||
|
putc('2)
|
||||||
|
putc('^)
|
||||||
|
p += 8
|
||||||
|
putn_signed(*8p)
|
||||||
|
putc(10)
|
||||||
|
|
||||||
|
i += 1
|
||||||
|
if i < 325 goto print_powers_of_10_loop
|
||||||
|
return
|
||||||
|
|
22
05/util.b
22
05/util.b
|
@ -267,11 +267,31 @@ function fputn
|
||||||
fputs(fd, s)
|
fputs(fd, s)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
function fputn_signed
|
||||||
|
argument fd
|
||||||
|
argument n
|
||||||
|
if n < 0 goto fputn_negative
|
||||||
|
|
||||||
|
fputn(fd, n)
|
||||||
|
return
|
||||||
|
|
||||||
|
:fputn_negative
|
||||||
|
fputc(fd, '-)
|
||||||
|
n = 0 - n
|
||||||
|
fputn(fd, n)
|
||||||
|
return
|
||||||
|
|
||||||
function putn
|
function putn
|
||||||
argument n
|
argument n
|
||||||
fputn(1, n)
|
fputn(1, n)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
function putn_signed
|
||||||
|
argument n
|
||||||
|
fputn_signed(1, n)
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
function fputc
|
function fputc
|
||||||
argument fd
|
argument fd
|
||||||
argument c
|
argument c
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue