code wiki / _hdl_build / _pe_f64sinhcosh.nx
_pe_f64sinhcosh.nx source
↩ module page · 166 lines · 6846 B
1// AUTHORED BY THE NISHI BUILDER (pattern: MATH_KERNEL / SINHCOSH) -- no Claude core logic.
2// All constants from the SOVEREIGN bigfloat spec (nx_mathspec_sinhcosh). Total domain.
3// Shared exp-dd core; exact-factorial Taylor below 1; no minimax anywhere.
4import "nx_syscalls.nx"
5import "nx_tier.nx"
6import "nx_f64.nx"
7import "nx_f64_div.nx"
8import "nx_f64_cvt.nx"
9const SH_SMASK: i64 = 0xFFFFFFFFF8000000
10func _sh_mul2(a: i64, b: i64, out: *i64) -> i64 {
11 let ah: i64 = a & SH_SMASK
12 let al: i64 = nx_f64_sub(a, ah)
13 let bh: i64 = b & SH_SMASK
14 let bl: i64 = nx_f64_sub(b, bh)
15 let p: i64 = nx_f64_mul(a, b)
16 var e: i64 = nx_f64_sub(nx_f64_mul(ah, bh), p)
17 e = nx_f64_add(e, nx_f64_mul(ah, bl))
18 e = nx_f64_add(e, nx_f64_mul(al, bh))
19 e = nx_f64_add(e, nx_f64_mul(al, bl))
20 out[0] = p
21 out[1] = e
22 return 0
23}
24func _sh_2sum(a: i64, b: i64, out: *i64) -> i64 {
25 let s: i64 = nx_f64_add(a, b)
26 let bv: i64 = nx_f64_sub(s, a)
27 let e: i64 = nx_f64_add(nx_f64_sub(a, nx_f64_sub(s, bv)), nx_f64_sub(b, bv))
28 out[0] = s
29 out[1] = e
30 return 0
31}
32func _sh_scale(v: i64, m: i64) -> i64 {
33 if (v & 0x7FFFFFFFFFFFFFFF) == 0 { return v }
34 return v + (m << 52)
35}
36func _sh_expdd(ax: i64, out: *i64) -> i64 {
37 let tk: i64 = nx_f64_add(nx_f64_mul(ax, 4609176140021203710), 4602678819172646912)
38 let n: i64 = nx_f64_to_i64(tk)
39 let kf: i64 = nx_i64_to_f64(n)
40 let r1: i64 = nx_f64_sub(ax, nx_f64_mul(kf, 4604418530035630080))
41 let w: i64 = nx_f64_mul(kf, 4512570848722726696)
42 let rh: i64 = nx_f64_sub(r1, w)
43 let rt: i64 = nx_f64_sub(nx_f64_sub(r1, rh), w)
44 let t3: i64 = nx_f64_mul(rh, rh)
45 var pp: i64 = (0 - 4798626848869608100)
46 pp = nx_f64_add(nx_f64_mul(pp, t3), 4448832621486575970)
47 pp = nx_f64_add(nx_f64_mul(pp, t3), (0 - 4750690651387713921))
48 pp = nx_f64_add(nx_f64_mul(pp, t3), 4496398441126497982)
49 pp = nx_f64_add(nx_f64_mul(pp, t3), (0 - 4702957064589873397))
50 pp = nx_f64_add(nx_f64_mul(pp, t3), 4544508515414250855)
51 pp = nx_f64_add(nx_f64_mul(pp, t3), (0 - 4654820494858425321))
52 pp = nx_f64_add(nx_f64_mul(pp, t3), 4595172819793696085)
53 let t1p: i64 = nx_f64_sub(rh, nx_f64_mul(t3, pp))
54 let dv: i64 = nx_f64_div(nx_f64_mul(rh, t1p), nx_f64_sub(t1p, 4611686018427387904))
55 let sv: *i64 = sys_mmap(16) as *i64
56 _sh_2sum(4607182418800017408, rh, sv)
57 let tail: i64 = nx_f64_sub(nx_f64_add(sv[1], rt), dv)
58 let zz: *i64 = sys_mmap(16) as *i64
59 _sh_2sum(sv[0], tail, zz)
60 out[0] = zz[0]
61 out[1] = zz[1]
62 out[2] = n
63 return 0
64}
65func nx_f64_sinh(x: i64) -> i64 {
66 let ax: i64 = x & 0x7FFFFFFFFFFFFFFF
67 let ef: i64 = (x >> 52) & 0x7FF
68 let sgn: i64 = (x >> 63) & 1
69 if ef == 2047 {
70 if (ax & 0x000FFFFFFFFFFFFF) != 0 { return 0x7FF8000000000000 }
71 return x
72 }
73 if ax == 0 { return x }
74 if ax >= 4649465237957771264 { return (sgn << 63) | 0x7FF0000000000000 }
75 if ax < 4607182418800017408 {
76 let z: i64 = nx_f64_mul(ax, ax)
77 var p: i64 = 4311945469071521138
78 p = nx_f64_add(nx_f64_mul(p, z), 4351309137733304663)
79 p = nx_f64_add(nx_f64_mul(p, z), 4389130328383466826)
80 p = nx_f64_add(nx_f64_mul(p, z), 4425604618586929183)
81 p = nx_f64_add(nx_f64_mul(p, z), 4460272573143870729)
82 p = nx_f64_add(nx_f64_mul(p, z), 4493156764026750180)
83 p = nx_f64_add(nx_f64_mul(p, z), 4523617214285662004)
84 p = nx_f64_add(nx_f64_mul(p, z), 4551452160554016794)
85 p = nx_f64_add(nx_f64_mul(p, z), 4575957461383581969)
86 p = nx_f64_add(nx_f64_mul(p, z), 4595172819793696085)
87 let res: i64 = nx_f64_add(ax, nx_f64_mul(nx_f64_mul(ax, z), p))
88 return (sgn << 63) | res
89 }
90 let eo2: *i64 = sys_mmap(24) as *i64
91 _sh_expdd(ax, eo2)
92 let zh: i64 = eo2[0]
93 let zl: i64 = eo2[1]
94 let n: i64 = eo2[2]
95 if ax >= 4628574517030027264 {
96 let m: i64 = nx_f64_add(zh, zl)
97 let eo: i64 = ((m >> 52) & 0x7FF) + n - 1
98 if eo >= 2047 { return (sgn << 63) | 0x7FF0000000000000 }
99 return (sgn << 63) | _sh_scale(m, n - 1)
100 }
101 let q0: i64 = nx_f64_div(4607182418800017408, zh)
102 let pr: *i64 = sys_mmap(16) as *i64
103 _sh_mul2(q0, zh, pr)
104 var e2: i64 = nx_f64_sub(nx_f64_sub(4607182418800017408, pr[0]), pr[1])
105 e2 = nx_f64_sub(e2, nx_f64_mul(q0, zl))
106 let ql: i64 = nx_f64_mul(q0, e2)
107 let ehv: i64 = _sh_scale(zh, n)
108 let elv: i64 = _sh_scale(zl, n)
109 let ihv: i64 = _sh_scale(q0, 0 - n)
110 let ilv: i64 = _sh_scale(ql, 0 - n)
111 let sv: *i64 = sys_mmap(16) as *i64
112 _sh_2sum(ehv, ihv ^ (1 << 63), sv)
113 let tail: i64 = nx_f64_sub(nx_f64_add(sv[1], elv), ilv)
114 let res2: i64 = nx_f64_add(sv[0], tail)
115 return (sgn << 63) | _sh_scale(res2, 0 - 1)
116}
117func nx_f64_cosh(x: i64) -> i64 {
118 let ax: i64 = x & 0x7FFFFFFFFFFFFFFF
119 let ef: i64 = (x >> 52) & 0x7FF
120 if ef == 2047 {
121 if (ax & 0x000FFFFFFFFFFFFF) != 0 { return 0x7FF8000000000000 }
122 return 0x7FF0000000000000
123 }
124 if ax == 0 { return 4607182418800017408 }
125 if ax >= 4649465237957771264 { return 0x7FF0000000000000 }
126 if ax < 4607182418800017408 {
127 let z: i64 = nx_f64_mul(ax, ax)
128 var p: i64 = 4331992437988917797
129 p = nx_f64_add(nx_f64_mul(p, z), 4370323941990432151)
130 p = nx_f64_add(nx_f64_mul(p, z), 4407590220077447199)
131 p = nx_f64_add(nx_f64_mul(p, z), 4443145680587881629)
132 p = nx_f64_add(nx_f64_mul(p, z), 4477122120089393304)
133 p = nx_f64_add(nx_f64_mul(p, z), 4508805057796939612)
134 p = nx_f64_add(nx_f64_mul(p, z), 4537941361671905306)
135 p = nx_f64_add(nx_f64_mul(p, z), 4564047942368979991)
136 p = nx_f64_add(nx_f64_mul(p, z), 4586165620538955093)
137 p = nx_f64_add(nx_f64_mul(p, z), 4602678819172646912)
138 return nx_f64_add(4607182418800017408, nx_f64_mul(z, p))
139 }
140 let eo2: *i64 = sys_mmap(24) as *i64
141 _sh_expdd(ax, eo2)
142 let zh: i64 = eo2[0]
143 let zl: i64 = eo2[1]
144 let n: i64 = eo2[2]
145 if ax >= 4628574517030027264 {
146 let m: i64 = nx_f64_add(zh, zl)
147 let eo: i64 = ((m >> 52) & 0x7FF) + n - 1
148 if eo >= 2047 { return 0x7FF0000000000000 }
149 return _sh_scale(m, n - 1)
150 }
151 let q0: i64 = nx_f64_div(4607182418800017408, zh)
152 let pr: *i64 = sys_mmap(16) as *i64
153 _sh_mul2(q0, zh, pr)
154 var e2: i64 = nx_f64_sub(nx_f64_sub(4607182418800017408, pr[0]), pr[1])
155 e2 = nx_f64_sub(e2, nx_f64_mul(q0, zl))
156 let ql: i64 = nx_f64_mul(q0, e2)
157 let ehv: i64 = _sh_scale(zh, n)
158 let elv: i64 = _sh_scale(zl, n)
159 let ihv: i64 = _sh_scale(q0, 0 - n)
160 let ilv: i64 = _sh_scale(ql, 0 - n)
161 let sv: *i64 = sys_mmap(16) as *i64
162 _sh_2sum(ehv, ihv, sv)
163 let tail: i64 = nx_f64_add(nx_f64_add(sv[1], elv), ilv)
164 let res2: i64 = nx_f64_add(sv[0], tail)
165 return _sh_scale(res2, 0 - 1)
166}