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}