code wiki / _hdl_build / _pe_f64sincos.nx

_pe_f64sincos.nx source

↩ module page · 74 lines · 3165 B

1// AUTHORED BY THE NISHI BUILDER (pattern: MATH_KERNEL / SINCOS) -- no Claude core logic. 2// All constants from the SOVEREIGN bigfloat spec (nx_mathspec_sincos). v1 domain |x| < 2^20. 3import "nx_syscalls.nx" 4import "nx_tier.nx" 5import "nx_f64.nx" 6import "nx_f64_cvt.nx" 7func _sc_reduce(x: i64, kout: *i64) -> i64 { 8 let t: i64 = nx_f64_mul(x, 4603909380684499075) 9 var tk: i64 = 0 10 if nx_f64_sign(t) == 1 { tk = nx_f64_sub(t, 4602678819172646912) } else { tk = nx_f64_add(t, 4602678819172646912) } 11 let k: i64 = nx_f64_to_i64(tk) 12 let kf: i64 = nx_i64_to_f64(k) 13 var r: i64 = nx_f64_sub(x, nx_f64_mul(kf, 4609753056924401664)) 14 r = nx_f64_sub(r, nx_f64_mul(kf, 4454258360616747008)) 15 r = nx_f64_sub(r, nx_f64_mul(kf, 4297306550709743712)) 16 kout[0] = k 17 return r 18} 19func _sc_sinp(r: i64) -> i64 { 20 let z: i64 = nx_f64_mul(r, r) 21 var p: i64 = (0 - 4872062899121471145) 22 p = nx_f64_add(nx_f64_mul(p, z), 4389130328383466826) 23 p = nx_f64_add(nx_f64_mul(p, z), (0 - 4797767418267846625)) 24 p = nx_f64_add(nx_f64_mul(p, z), 4460272573143870729) 25 p = nx_f64_add(nx_f64_mul(p, z), (0 - 4730215272828025628)) 26 p = nx_f64_add(nx_f64_mul(p, z), 4523617214285662004) 27 p = nx_f64_add(nx_f64_mul(p, z), (0 - 4671919876300759014)) 28 p = nx_f64_add(nx_f64_mul(p, z), 4575957461383581969) 29 p = nx_f64_add(nx_f64_mul(p, z), (0 - 4628199217061079723)) 30 p = nx_f64_add(nx_f64_mul(p, z), 4607182418800017408) 31 return nx_f64_mul(r, p) 32} 33func _sc_cosp(r: i64) -> i64 { 34 let z: i64 = nx_f64_mul(r, r) 35 var q: i64 = (0 - 4853048094864343657) 36 q = nx_f64_add(nx_f64_mul(q, z), 4407590220077447199) 37 q = nx_f64_add(nx_f64_mul(q, z), (0 - 4780226356266894179)) 38 q = nx_f64_add(nx_f64_mul(q, z), 4477122120089393304) 39 q = nx_f64_add(nx_f64_mul(q, z), (0 - 4714566979057836196)) 40 q = nx_f64_add(nx_f64_mul(q, z), 4537941361671905306) 41 q = nx_f64_add(nx_f64_mul(q, z), (0 - 4659324094485795817)) 42 q = nx_f64_add(nx_f64_mul(q, z), 4586165620538955093) 43 q = nx_f64_add(nx_f64_mul(q, z), (0 - 4620693217682128896)) 44 q = nx_f64_add(nx_f64_mul(q, z), 4607182418800017408) 45 return q 46} 47func nx_f64_sin(x: i64) -> i64 { 48 let ax: i64 = x & 0x7FFFFFFFFFFFFFFF 49 let ef: i64 = (x >> 52) & 0x7FF 50 if ef == 2047 { return 0x7FF8000000000000 } 51 if ax == 0 { return x } 52 if ef >= 1043 { return 0x7FF8000000000000 } 53 let ko: *i64 = sys_mmap(16) as *i64 54 let r: i64 = _sc_reduce(x, ko) 55 let kk: i64 = ko[0] & 3 56 if kk == 0 { return _sc_sinp(r) } 57 if kk == 1 { return _sc_cosp(r) } 58 if kk == 2 { return nx_f64_neg(_sc_sinp(r)) } 59 return nx_f64_neg(_sc_cosp(r)) 60} 61func nx_f64_cos(x: i64) -> i64 { 62 let ax: i64 = x & 0x7FFFFFFFFFFFFFFF 63 let ef: i64 = (x >> 52) & 0x7FF 64 if ef == 2047 { return 0x7FF8000000000000 } 65 if ax == 0 { return 4607182418800017408 } 66 if ef >= 1043 { return 0x7FF8000000000000 } 67 let ko: *i64 = sys_mmap(16) as *i64 68 let r: i64 = _sc_reduce(x, ko) 69 let kk: i64 = ko[0] & 3 70 if kk == 0 { return _sc_cosp(r) } 71 if kk == 1 { return nx_f64_neg(_sc_sinp(r)) } 72 if kk == 2 { return nx_f64_neg(_sc_cosp(r)) } 73 return _sc_sinp(r) 74}