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}