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}