code wiki / _hdl_build / _wb_mathk.nx

_wb_mathk.nx source

↩ module page · 46 lines · 2079 B

1// AUTHORED BY THE NISHI BUILDER (pattern: MATH_KERNEL / LOG_REDUCE) -- no Claude core logic. 2// Natural log, binary64 bits-up. All constants from the oracle-generated spec table. 3import "nx_syscalls.nx" 4import "nx_tier.nx" 5import "nx_f64.nx" 6import "nx_f64_div.nx" 7import "nx_f64_cvt.nx" 8func _wb_mathk(x: i64) -> i64 { 9 let cls: nx_int = nx_f64_classify(x) 10 if cls == NX_F64_CLS_NAN { return NX_F64_NAN_RAW } 11 if cls == NX_F64_CLS_ZERO { return 0xFFF0000000000000 } 12 if nx_f64_sign(x) == 1 { return NX_F64_NAN_RAW } 13 if cls == NX_F64_CLS_INF { return x } 14 var sig: i64 = nx_f64_mant_field(x) 15 var ef: i64 = nx_f64_exp_field(x) 16 if ef == 0 { 17 ef = 1 18 while sig < NX_F64_IMPLICIT_1 { sig = sig << 1; ef = ef - 1 } 19 } else { 20 sig = sig | NX_F64_IMPLICIT_1 21 } 22 var k: i64 = ef - 1023 23 var mexp: i64 = 1023 24 if sig >= 6369051672525773 { k = k + 1; mexp = 1022 } 25 let mfv: i64 = (mexp << 52) | (sig & NX_F64_MANT_MASK) 26 let f: i64 = nx_f64_sub(mfv, 4607182418800017408) 27 let two: i64 = nx_f64_add(4607182418800017408, 4607182418800017408) 28 let s: i64 = nx_f64_div(f, nx_f64_add(two, f)) 29 let z: i64 = nx_f64_mul(s, s) 30 var p: i64 = 4590930298405593444 31 p = nx_f64_add(nx_f64_mul(p, z), 4591527048666777112) 32 p = nx_f64_add(nx_f64_mul(p, z), 4592249430561894184) 33 p = nx_f64_add(nx_f64_mul(p, z), 4593141784667627038) 34 p = nx_f64_add(nx_f64_mul(p, z), 4593971859893063953) 35 p = nx_f64_add(nx_f64_mul(p, z), 4594710912139606804) 36 p = nx_f64_add(nx_f64_mul(p, z), 4595718710657619782) 37 p = nx_f64_add(nx_f64_mul(p, z), 4597174419628082972) 38 p = nx_f64_add(nx_f64_mul(p, z), 4598818590920615058) 39 p = nx_f64_add(nx_f64_mul(p, z), 4600877379321698714) 40 p = nx_f64_add(nx_f64_mul(p, z), 4604180019048437077) 41 let r: i64 = nx_f64_mul(z, p) 42 let lnm: i64 = nx_f64_sub(f, nx_f64_mul(s, nx_f64_sub(f, r))) 43 let kf: i64 = nx_i64_to_f64(k) 44 let tlo: i64 = nx_f64_add(lnm, nx_f64_mul(kf, 4494016781675590265)) 45 return nx_f64_add(nx_f64_mul(kf, 4604418534062161920), tlo) 46}