code wiki / _hdl_build / _pw_probe.nx
_pw_probe.nx source
↩ module page · 41 lines · 1747 B
1// _pw_probe.nx -- localizer for the pow kernel dd-log2 stage: prints t1/t2 and
2// the bigfloat truth log2(x). HISTORY: this probe proved the dd-log2 stage
3// BIT-PERFECT (t1+t2 == truth) on first-build RED, isolating the defect to the
4// exp recombination (extra z*t1p term) -- localize before optimizing.
5import "nx_syscalls.nx"
6import "nx_f64.nx"
7import "nx_f64_div.nx"
8import "nx_f64_cvt.nx"
9import "nx_bigfloat120.nx"
10import "nx_bigfloat120_div.nx"
11import "nx_bigfloat120_exp.nx"
12import "nx_bigfloat120_ln.nx"
13import "nx_bigfloat120_pow.nx"
14import "_pe_f64pow.nx"
15
16func pb_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
17func pb_puthex(v: i64) -> i64 { let bb: *u8 = sys_mmap(20); var i: i64 = 0; while i < 16 { let nib: i64 = (v >> ((15 - i) * 4)) & 15; if nib < 10 { bb[i] = 48 + nib } else { bb[i] = 55 + nib } i = i + 1 } sys_write(1, bb, 16); return 0 }
18func pb_row(name: *u8, v: i64) -> i64 { pb_puts(name); pb_puthex(v); pb_puts("\n" as *u8); return 0 }
19
20func main() -> i64 {
21 let x: i64 = 0x3FD18A22DE41DFFE // historic failing point, k=0 path
22 var sig: i64 = x & 0x000FFFFFFFFFFFFF
23 var ef: i64 = (x >> 52) & 0x7FF
24 let n: i64 = ef - 1023
25 let mraw: i64 = (1023 << 52) | sig
26 pb_row("mraw=" as *u8, mraw)
27 let lo2: *i64 = sys_mmap(16) as *i64
28 _pw_log2m(mraw, n, lo2)
29 pb_row("t1=" as *u8, lo2[0])
30 pb_row("t2=" as *u8, lo2[1])
31 pb_row("t1+t2=" as *u8, nx_f64_add(lo2[0], lo2[1]))
32 let lt: *i64 = bf_new()
33 let lsign: i64 = bfp_ln_big(lt, x)
34 let ln2: *i64 = bf_new()
35 bf_ln2(ln2)
36 let lg: *i64 = bf_new()
37 bf_div(lg, lt, ln2)
38 pb_row("truth=" as *u8, bf_to_f64(lg, lsign, 0))
39 sys_exit(0)
40 return 0
41}