testing trig and log
This commit is contained in:
parent
b4104e2c7d
commit
4e93396b4d
|
@ -117,7 +117,7 @@
|
||||||
&<100 DUP #0a LTH ,&<10 JCN
|
&<100 DUP #0a LTH ,&<10 JCN
|
||||||
&>=10 #0a DIVk DUP x16-emit-dec-digit MUL SUB
|
&>=10 #0a DIVk DUP x16-emit-dec-digit MUL SUB
|
||||||
&<10 x16-emit-dec-digit
|
&<10 x16-emit-dec-digit
|
||||||
LIT '. #18 DEO
|
LIT ". #18 DEO
|
||||||
( emit fractional part )
|
( emit fractional part )
|
||||||
#00 SWP ( lo* )
|
#00 SWP ( lo* )
|
||||||
#000a MUL2 #0100 DIV2k DUP2 NIP x16-emit-dec-digit MUL2 SUB2
|
#000a MUL2 #0100 DIV2k DUP2 NIP x16-emit-dec-digit MUL2 SUB2
|
||||||
|
|
|
@ -1,33 +1,53 @@
|
||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
|
|
||||||
from math import floor, log
|
from math import floor, log, sin, cos, tan, copysign
|
||||||
from os import environ
|
from os import environ
|
||||||
from random import randint
|
from random import randint
|
||||||
from subprocess import Popen, PIPE, run
|
from subprocess import Popen, PIPE, run
|
||||||
|
|
||||||
|
def tosigned(x):
|
||||||
|
return x if x < 32768 else x - 65536
|
||||||
|
|
||||||
u8 = {'sz': 1 << 8, 'fmt': b'%02x'}
|
u8 = {'sz': 1 << 8, 'fmt': b'%02x'}
|
||||||
u16 = {'sz': 1 << 16, 'fmt': b'%04x'}
|
u16 = {'sz': 1 << 16, 'fmt': b'%04x'}
|
||||||
z16 = {'sz': 1 << 16, 'fmt': b'%04x'}
|
z16 = {'sz': 1 << 16, 'fmt': b'%04x'}
|
||||||
|
p16 = {'sz': 1 << 16, 'fmt': b'%04x'}
|
||||||
|
t16 = {'sz': 1 << 16, 'fmt': b'%04x'}
|
||||||
|
|
||||||
def eq(got, expected):
|
def eq(got, expected):
|
||||||
return got == expected
|
return got == expected
|
||||||
def booleq(got, expected):
|
def booleq(got, expected):
|
||||||
return bool(got) == bool(expected)
|
return bool(got) == bool(expected)
|
||||||
def releq(got, expected):
|
def releq(got0, expected0):
|
||||||
|
got, expected = tosigned(got0), tosigned(expected0)
|
||||||
if (expected - 1) <= got and got <= (expected + 1):
|
if (expected - 1) <= got and got <= (expected + 1):
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
error = abs(got - expected) / (abs(expected) + 0.001)
|
error = abs(got - expected) / (abs(expected) + 0.001)
|
||||||
return error < 0.01
|
return error < 0.01
|
||||||
|
def abseq(got0, expected0):
|
||||||
|
got, expected = tosigned(got0), tosigned(expected0)
|
||||||
|
if (expected - 10) <= got and got <= (expected + 10):
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
def taneq(got0, expected0):
|
||||||
|
got, expected = tosigned(got0), tosigned(expected0)
|
||||||
|
if (expected - 1) <= got and got <= (expected + 1):
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
error = abs(got - expected) / (abs(expected) + 0.001)
|
||||||
|
return error < 0.1
|
||||||
|
|
||||||
def testcase(p, sym, args, out, f, eq):
|
def testcase(p, sym, args, out, f, eq):
|
||||||
vals = []
|
vals = []
|
||||||
for name, g in args:
|
for name, g in args:
|
||||||
val = randint(0, g['sz'] - 1)
|
val = randint(0, g['sz'] - 1)
|
||||||
while val == 0 and g is z16:
|
while ((val == 0 and (g is z16 or g is p16)) or
|
||||||
|
(val >= 0x8000 and g is p16) or
|
||||||
|
(g is t16 and ((val >= 804) or ((val % 804) == 402)))):
|
||||||
val = randint(0, g['sz'] - 1)
|
val = randint(0, g['sz'] - 1)
|
||||||
vals.append((name, g, val))
|
vals.append((name, g, val))
|
||||||
#vals = [(name, g, randint(0, g['sz'] - 1)) for (name, g) in args]
|
|
||||||
p.stdin.write(sym)
|
p.stdin.write(sym)
|
||||||
for _, g, x in vals:
|
for _, g, x in vals:
|
||||||
p.stdin.write(g['fmt'] % x)
|
p.stdin.write(g['fmt'] % x)
|
||||||
|
@ -85,8 +105,6 @@ def x16_eq(x, y):
|
||||||
return x == y
|
return x == y
|
||||||
def x16_ne(x, y):
|
def x16_ne(x, y):
|
||||||
return x != y
|
return x != y
|
||||||
def tosigned(x):
|
|
||||||
return x if x < 32768 else x - 65536
|
|
||||||
def x16_lt(x, y):
|
def x16_lt(x, y):
|
||||||
return int(tosigned(x) < tosigned(y))
|
return int(tosigned(x) < tosigned(y))
|
||||||
def x16_gt(x, y):
|
def x16_gt(x, y):
|
||||||
|
@ -95,9 +113,22 @@ def x16_lteq(x, y):
|
||||||
return int(tosigned(x) <= tosigned(y))
|
return int(tosigned(x) <= tosigned(y))
|
||||||
def x16_gteq(x, y):
|
def x16_gteq(x, y):
|
||||||
return int(tosigned(x) >= tosigned(y))
|
return int(tosigned(x) >= tosigned(y))
|
||||||
|
def x16_sin(x):
|
||||||
|
z = round(sin(x / 256) * 256)
|
||||||
|
return z if z >= 0 else 65536 + z
|
||||||
|
def x16_cos(x):
|
||||||
|
z = round(cos(x / 256) * 256)
|
||||||
|
return z if z >= 0 else 65536 + z
|
||||||
|
def x16_tan(x):
|
||||||
|
z0 = round(tan(x / 256) * 256)
|
||||||
|
z = min(max(z0, -0x7fff), 0x7fff)
|
||||||
|
return z if z >= 0 else 65536 + z
|
||||||
|
def x16_log(x):
|
||||||
|
z = round(log(x / 256) * 256)
|
||||||
|
return z if z >= 0 else 65536 + z
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
trials = 100000
|
trials = 10000
|
||||||
run(['uxnasm', 'test-fix16.tal', 'run.rom'])
|
run(['uxnasm', 'test-fix16.tal', 'run.rom'])
|
||||||
p = pipe()
|
p = pipe()
|
||||||
test(p, trials, b'+', [('x', u16), ('y', u16)], u16, x16_add)
|
test(p, trials, b'+', [('x', u16), ('y', u16)], u16, x16_add)
|
||||||
|
@ -114,6 +145,10 @@ def main():
|
||||||
test(p, trials, b'>', [('x', u16), ('y', u16)], u8, x16_gt)
|
test(p, trials, b'>', [('x', u16), ('y', u16)], u8, x16_gt)
|
||||||
test(p, trials, b'{', [('x', u16), ('y', u16)], u8, x16_lteq)
|
test(p, trials, b'{', [('x', u16), ('y', u16)], u8, x16_lteq)
|
||||||
test(p, trials, b'}', [('x', u16), ('y', u16)], u8, x16_gteq)
|
test(p, trials, b'}', [('x', u16), ('y', u16)], u8, x16_gteq)
|
||||||
|
test(p, trials, b's', [('x', p16)], u16, x16_sin, eq=abseq)
|
||||||
|
test(p, trials, b'c', [('x', p16)], u16, x16_cos, eq=abseq)
|
||||||
|
test(p, trials, b't', [('x', t16)], u16, x16_tan, eq=taneq)
|
||||||
|
test(p, trials, b'l', [('x', p16)], u16, x16_log, eq=releq)
|
||||||
p.stdin.write(b'\n\n')
|
p.stdin.write(b'\n\n')
|
||||||
p.stdin.flush()
|
p.stdin.flush()
|
||||||
p.stdin.close()
|
p.stdin.close()
|
||||||
|
|
Loading…
Reference in New Issue