code wiki / _hdl_build / _pe_f64atan.nx
_pe_f64atan.nx source
↩ module page · 117 lines · 4085 B
1// AUTHORED BY THE NISHI BUILDER (pattern: MATH_KERNEL / ATAN) -- no Claude core logic.
2// All constants from the SOVEREIGN bigfloat spec (nx_mathspec_atan). Total domain.
3import "nx_syscalls.nx"
4import "nx_tier.nx"
5import "nx_f64.nx"
6import "nx_f64_div.nx"
7import "nx_f64_cvt.nx"
8func _at_tab(tb: *i64) -> i64 {
9 tb[0] = 0
10 tb[1] = 4593671619917905920
11 tb[2] = 4598175219545276416
12 tb[3] = 4600427019358961664
13 tb[4] = 4602678819172646912
14 tb[5] = 4603804719079489536
15 tb[6] = 4604930618986332160
16 tb[7] = 4606056518893174784
17 tb[8] = 4607182418800017408
18 tb[9] = 4607745368753438720
19 tb[10] = 4608308318706860032
20 tb[11] = 4608871268660281344
21 tb[12] = 4609434218613702656
22 tb[13] = 4609997168567123968
23 tb[14] = 4610560118520545280
24 tb[15] = 4611123068473966592
25 tb[16] = 4611686018427387904
26 tb[17] = 4611967493404098560
27 tb[18] = 4612248968380809216
28 tb[19] = 4612530443357519872
29 tb[20] = 4612811918334230528
30 tb[21] = 0
31 tb[22] = 4593625142376804206
32 tb[23] = 4597994306818310365
33 tb[24] = 4600134657745673969
34 tb[25] = 4602023952714414927
35 tb[26] = 4603206634882137780
36 tb[27] = 4603971362252824289
37 tb[28] = 4604649864582153780
38 tb[29] = 4605249457297304856
39 tb[30] = 4605778682699881608
40 tb[31] = 4606246168937394078
41 tb[32] = 4606660001606948305
42 tb[33] = 4607027438436873883
43 tb[34] = 4607268623750922711
44 tb[35] = 4607415030678003871
45 tb[36] = 4607546485292731617
46 tb[37] = 4607664973725548100
47 tb[38] = 4607772182032604726
48 tb[39] = 4607869541989825061
49 tb[40] = 4607958271386873283
50 tb[41] = 4608039408546500008
51 tb[42] = 0
52 tb[43] = (0 - 4878291790333604841)
53 tb[44] = 4352917529811201981
54 tb[45] = (0 - 4864903911796446952)
55 tb[46] = 4357843414468748770
56 tb[47] = (0 - 4874820182729922929)
57 tb[48] = 4355615921582285912
58 tb[49] = (0 - 4865924661261967626)
59 tb[50] = 4359948597267291143
60 tb[51] = (0 - 4860535678763075533)
61 tb[52] = 4359725100183947883
62 tb[53] = 4363841555080623064
63 tb[54] = 4354989122426817469
64 tb[55] = 4352466619881045686
65 tb[56] = (0 - 4856058129288528528)
66 tb[57] = (0 - 4867807539306807390)
67 tb[58] = 4367114252914819726
68 tb[59] = 4365263979901519688
69 tb[60] = (0 - 4856456334828141317)
70 tb[61] = 4366287312497584361
71 tb[62] = 4365717900086718873
72 return 63
73}
74func _at_poly(t: i64) -> i64 {
75 let z: i64 = nx_f64_mul(t, t)
76 var p: i64 = (0 - 4633903776589082351)
77 p = nx_f64_add(nx_f64_mul(p, z), 4590207312512236308)
78 p = nx_f64_add(nx_f64_mul(p, z), (0 - 4632156925824526522))
79 p = nx_f64_add(nx_f64_mul(p, z), 4592670820000712476)
80 p = nx_f64_add(nx_f64_mul(p, z), (0 - 4629057045561531246))
81 p = nx_f64_add(nx_f64_mul(p, z), 4596373779694328218)
82 p = nx_f64_add(nx_f64_mul(p, z), (0 - 4623695617433709227))
83 p = nx_f64_add(nx_f64_mul(p, z), 4607182418800017408)
84 return nx_f64_mul(t, p)
85}
86func _at_core(ax: i64) -> i64 {
87 let tk: i64 = nx_f64_add(nx_f64_mul(ax, 4620693217682128896), 4602678819172646912)
88 let j: i64 = nx_f64_to_i64(tk)
89 let tb: *i64 = sys_mmap(8 * 63) as *i64
90 _at_tab(tb)
91 let cj: i64 = tb[j]
92 let num: i64 = nx_f64_sub(ax, cj)
93 let den: i64 = nx_f64_add(4607182418800017408, nx_f64_mul(ax, cj))
94 let t: i64 = nx_f64_div(num, den)
95 let p: i64 = _at_poly(t)
96 return nx_f64_add(tb[21 + j], nx_f64_add(tb[42 + j], p))
97}
98func nx_f64_atan(x: i64) -> i64 {
99 let ax: i64 = x & 0x7FFFFFFFFFFFFFFF
100 let ef: i64 = (x >> 52) & 0x7FF
101 let sgn: i64 = (x >> 63) & 1
102 if ef == 2047 {
103 if (ax & 0x000FFFFFFFFFFFFF) != 0 { return 0x7FF8000000000000 }
104 if sgn == 1 { return 4609753056924675352 | (1 << 63) }
105 return 4609753056924675352
106 }
107 var v: i64 = 0
108 if ax < 4612952655822585856 {
109 v = _at_core(ax)
110 } else {
111 let u: i64 = nx_f64_div(4607182418800017408, ax)
112 v = _at_core(u)
113 v = nx_f64_sub(4609753056924675352, nx_f64_sub(v, 4364452196894661639))
114 }
115 if sgn == 1 { return v | (1 << 63) }
116 return v
117}