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}