code wiki / _hdl_build / _f64_atan_gate_emitted.nx

_f64_atan_gate_emitted.nx source

↩ module page · 114 lines · 4398 B

1// AUTHORED BY THE NISHI BUILDER (pattern: MATH_GATE) -- no Claude core logic. 2// Live-oracle ULP gate from the data spec; helper templates proven-and-baked. 3import "nx_syscalls.nx" 4import "nx_f64.nx" 5import "nx_f64_div.nx" 6import "nx_f64_cvt.nx" 7import "nx_bigfloat120.nx" 8import "nx_bigfloat120_div.nx" 9import "nx_bigfloat120_trig.nx" 10import "nx_bigfloat120_atan.nx" 11import "_pe_f64atan.nx" 12func mg_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 13func mg_putn(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 } 14func mg_puthex(v: i64) -> i64 { let bb: *u8 = sys_mmap(20); var i: i64 = 0; while i < 16 { let nib: i64 = (v >> ((15 - i) * 4)) & 15; if nib < 10 { bb[i] = 48 + nib } else { bb[i] = 55 + nib } i = i + 1 } sys_write(1, bb, 16); return 0 } 15func mg_rng(state: *i64) -> i64 { 16 var s: i64 = state[0] 17 s = s ^ ((s >> 12) & 0x000FFFFFFFFFFFFF) 18 s = s ^ (s << 25) 19 s = s ^ ((s >> 27) & 0x0000001FFFFFFFFF) 20 state[0] = s 21 return s * 2685821657736338717 22} 23func mg_ord(v: i64) -> i64 { 24 if v >= 0 { return v } 25 return (1 << 63) - v 26} 27func mg_ulp(got: i64, want: i64) -> i64 { 28 if got == want { return 0 } 29 var u: i64 = mg_ord(got) - mg_ord(want) 30 if u < 0 { u = 0 - u } 31 return u 32} 33func main() -> i64 { 34 let xs: *i64 = sys_mmap(8 * 1024) as *i64 35 var n: i64 = 0 36 xs[n] = 9221120237041090560; n = n + 1 37 xs[n] = 9218868437227405312; n = n + 1 38 xs[n] = 0 - 4503599627370496; n = n + 1 39 xs[n] = 0; n = n + 1 40 xs[n] = 0 - -; n = n + 1 41 xs[n] = 1; n = n + 1 42 xs[n] = 4503599627370495; n = n + 1 43 xs[n] = 4503599627370496; n = n + 1 44 xs[n] = 9218868437227405311; n = n + 1 45 xs[n] = 4607182418800017408; n = n + 1 46 xs[n] = 0 - 4616189618054758400; n = n + 1 47 xs[n] = 4607182418800017407; n = n + 1 48 xs[n] = 4607182418800017409; n = n + 1 49 xs[n] = 4612952655822585856; n = n + 1 50 xs[n] = 4612952655822585855; n = n + 1 51 xs[n] = 4612952655822585857; n = n + 1 52 xs[n] = 4593671619917905920; n = n + 1 53 xs[n] = 4589168020290535424; n = n + 1 54 xs[n] = 4600427019358961664; n = n + 1 55 xs[n] = 4611686018427387904; n = n + 1 56 xs[n] = 0 - 4610841593497255936; n = n + 1 57 xs[n] = 4490088828488384512; n = n + 1 58 let st: *i64 = sys_mmap(16) as *i64 59 st[0] = 0 - 2266404186210603134 60 var j: i64 = 0 61 while j < 300 { 62 var raw: i64 = mg_rng(st) 63 var efr: i64 = 0 64 let band: i64 = raw & 3 65 if band == 0 { efr = 1021 + (raw & 3) } 66 if band == 1 { efr = 1015 + (raw & 15) } 67 if band == 2 { efr = 960 + (raw & 63) } 68 if band == 3 { efr = 1026 + (raw & 511) } 69 raw = (efr << 52) | (mg_rng(st) & 0x000FFFFFFFFFFFFF) 70 if (mg_rng(st) & 1) == 1 { raw = raw | (1 << 63) } 71 xs[n] = raw 72 n = n + 1 73 j = j + 1 74 } 75 var g_exact: i64 = 0 76 var g_u1: i64 = 0 77 var g_worse: i64 = 0 78 var g_max: i64 = 0 79 var i: i64 = 0 80 while i < n { 81 let x: i64 = xs[i] 82 let want: i64 = bf_atan_f64(x) 83 let got: i64 = nx_f64_atan(x) 84 let u: i64 = mg_ulp(got, want) 85 if u == 0 { g_exact = g_exact + 1 } 86 if u == 1 { g_u1 = g_u1 + 1 } 87 if u > 1 { 88 g_worse = g_worse + 1 89 if g_worse <= 20 { 90 mg_puts("ATANBAD x=" as *u8); mg_puthex(x) 91 mg_puts(" exp=" as *u8); mg_puthex(want) 92 mg_puts(" got=" as *u8); mg_puthex(got) 93 mg_puts(" ulp=" as *u8); mg_putn(u) 94 mg_puts("\n" as *u8) 95 } 96 } 97 if u > g_max { g_max = u } 98 i = i + 1 99 } 100 mg_puts("ATAN-ULP total=" as *u8); mg_putn(n) 101 mg_puts(" exact=" as *u8); mg_putn(g_exact) 102 mg_puts(" ulp1=" as *u8); mg_putn(g_u1) 103 mg_puts(" worse=" as *u8); mg_putn(g_worse) 104 mg_puts(" max=" as *u8); mg_putn(g_max) 105 mg_puts("\n" as *u8) 106 if g_worse == 0 { 107 mg_puts("ATAN-GATE verdict=GREEN\n" as *u8) 108 return 0 109 } 110 mg_puts("ATAN-GATE verdict=RED\n" as *u8) 111 var rc: i64 = g_worse 112 if rc > 100 { rc = 100 } 113 return rc 114}