nx_js_f64_test.nx source
↩ module page · 83 lines · 4620 B
1// nx_js_f64_test.nx -- gate for the f64 converter library nx_js_f64.nx (R-JS-F64-0/1).
2// expect_exit: 0
3import "nx_js_f64.nx"
4
5func jf_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
6func jf_pn(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48;k=1}; while m>0{t[k]=48+(m%10);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k); return 0 }
7func jf_slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
8func jf_pf64(s: *u8, want: i64) -> i64 { if jparse_f64(s, jf_slen(s)) == want { return 1 } return 0 }
9func jf_fmt(raw: i64, want: *u8) -> i64 {
10 let buf: *u8 = sys_mmap(64)
11 let n: i64 = jf64_to_str(raw, buf)
12 let wl: i64 = jf_slen(want)
13 if n != wl { return 0 }
14 var i: i64 = 0
15 while i < wl { if (buf[i] & 0xff) != (want[i] & 0xff) { return 0 } i = i + 1 }
16 return 1
17}
18
19func main() -> i64 {
20 var pass: i64 = 0
21 var tot: i64 = 0
22 jf_puts("nx_js_f64 gate (R-JS-F64-0/1: int<->f64 + string<->f64 converters)\n" as *u8)
23
24 var r1: i64 = 1
25 if ji2f(0) != 0 { r1 = 0 }
26 if ji2f(1) != F64_ONE { r1 = 0 }
27 if ji2f(2) != 0x4000000000000000 { r1 = 0 }
28 if ji2f(3) != 0x4008000000000000 { r1 = 0 }
29 if ji2f(10) != F64_TEN { r1 = 0 }
30 if ji2f(100) != 0x4059000000000000 { r1 = 0 }
31 if ji2f(0 - 5) != nx_f64_neg(0x4014000000000000) { r1 = 0 }
32 if r1 == 1 { jf_puts(" PASS KAT1 ji2f: 0/1/2/3/10/100/-5 -> exact f64 bit patterns\n" as *u8); pass=pass+1 } else { jf_puts(" FAIL KAT1 ji2f\n" as *u8) }
33 tot = tot + 1
34
35 var r2: i64 = 1
36 if jf2i(ji2f(0)) != 0 { r2 = 0 }
37 if jf2i(ji2f(7)) != 7 { r2 = 0 }
38 if jf2i(ji2f(100)) != 100 { r2 = 0 }
39 if jf2i(ji2f(0 - 42)) != (0 - 42) { r2 = 0 }
40 if jf2i(ji2f(12345)) != 12345 { r2 = 0 }
41 if jf2i(0x3FE0000000000000) != 0 { r2 = 0 }
42 if jf2i(0x4008000000000000) != 3 { r2 = 0 }
43 if r2 == 1 { jf_puts(" PASS KAT2 jf2i: truncates 0.5->0, 3.0->3; ji2f<->jf2i round-trips\n" as *u8); pass=pass+1 } else { jf_puts(" FAIL KAT2 jf2i\n" as *u8) }
44 tot = tot + 1
45
46 var r3: i64 = jf_pf64("0.5\x00" as *u8, 0x3FE0000000000000)
47 if jf_pf64("0.25\x00" as *u8, 0x3FD0000000000000) == 0 { r3 = 0 }
48 if jf_pf64("0.125\x00" as *u8, 0x3FC0000000000000) == 0 { r3 = 0 }
49 if jf_pf64("1.5\x00" as *u8, 0x3FF8000000000000) == 0 { r3 = 0 }
50 if jf_pf64("2.5\x00" as *u8, 0x4004000000000000) == 0 { r3 = 0 }
51 if jf_pf64("3\x00" as *u8, 0x4008000000000000) == 0 { r3 = 0 }
52 if jf_pf64("100\x00" as *u8, 0x4059000000000000) == 0 { r3 = 0 }
53 if jf_pf64("0.75\x00" as *u8, 0x3FE8000000000000) == 0 { r3 = 0 }
54 if r3 == 1 { jf_puts(" PASS KAT3 jparse_f64: 0.5/0.25/0.125/1.5/2.5/3/100/0.75 -> exact f64 bits\n" as *u8); pass=pass+1 } else { jf_puts(" FAIL KAT3 jparse_f64\n" as *u8) }
55 tot = tot + 1
56
57 var r4: i64 = jf_pf64("-2.5\x00" as *u8, nx_f64_neg(0x4004000000000000))
58 if jf2i(jparse_f64("42\x00" as *u8, 2)) != 42 { r4 = 0 }
59 if jf2i(jparse_f64("3.99\x00" as *u8, 4)) != 3 { r4 = 0 }
60 if jparse_f64("0.5\x00" as *u8, 3) == ji2f(1) { r4 = 0 }
61 if jparse_f64("0.5\x00" as *u8, 3) != 0x3FE0000000000000 { r4 = 0 }
62 if r4 == 1 { jf_puts(" PASS KAT4 sign + parse->trunc (42, 3.99->3) + tamper (0.5 != 1.0)\n" as *u8); pass=pass+1 } else { jf_puts(" FAIL KAT4 sign/roundtrip/tamper\n" as *u8) }
63 tot = tot + 1
64
65 var r5: i64 = jf_fmt(0x3FE0000000000000, "0.5\x00" as *u8)
66 if jf_fmt(0x4004000000000000, "2.5\x00" as *u8) == 0 { r5 = 0 }
67 if jf_fmt(0x3FC0000000000000, "0.125\x00" as *u8) == 0 { r5 = 0 }
68 if jf_fmt(0x4008000000000000, "3\x00" as *u8) == 0 { r5 = 0 }
69 if jf_fmt(0x4059000000000000, "100\x00" as *u8) == 0 { r5 = 0 }
70 if jf_fmt(0x3FE8000000000000, "0.75\x00" as *u8) == 0 { r5 = 0 }
71 if jf_fmt(nx_f64_neg(0x4004000000000000), "-2.5\x00" as *u8) == 0 { r5 = 0 }
72 if jf_fmt(0, "0\x00" as *u8) == 0 { r5 = 0 }
73 let rtbuf: *u8 = sys_mmap(64)
74 let rtn: i64 = jf64_to_str(jparse_f64("1.5\x00" as *u8, 3), rtbuf)
75 if jparse_f64(rtbuf, rtn) != 0x3FF8000000000000 { r5 = 0 }
76 if r5 == 1 { jf_puts(" PASS KAT5 jf64_to_str: 0.5/2.5/0.125/3/100/0.75/-2.5/0 exact; round-trips\n" as *u8); pass=pass+1 } else { jf_puts(" FAIL KAT5 jf64_to_str\n" as *u8) }
77 tot = tot + 1
78
79 jf_puts("---- nx_js_f64 gate: passed " as *u8); jf_pn(pass); jf_puts(" / " as *u8); jf_pn(tot); jf_puts("\n" as *u8)
80 if pass == tot { sys_exit(0); return 0 }
81 sys_exit(1)
82 return 1
83}