code wiki / (root) / nx_js_f64_test.nx

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}