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}