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}