code wiki / _hdl_build / nx_geo_haversine_gate.nx

nx_geo_haversine_gate.nx source

↩ module page · 65 lines · 3494 B

1// nx_geo_haversine_gate.nx -- GATE for GEO-003b great-circle (haversine) distance. Proves: 2// same-point : d(NYC,NYC) == 0 3// NYC -> London : haversine within 2% of the true great-circle ~5,570 km 4// NYC -> Sydney : haversine within 2% of the true great-circle ~15,990 km 5// MEASURED EXCEED : for NYC->Sydney, |haversine - true| < |equirectangular - true| -- haversine is 6// strictly CLOSER to the true great-circle than the GEO-003 flat-earth baseline. 7// This is the no-wave proof that GEO-003b adds real precision over GEO-003 at continental scale. 8// 9// Evidence -> knowledge/status/geo_haversine.log (GEOHAVGATE authored=organ ... verdict=GREEN). 10// license_tier: ORIGINAL 11import "nx_geo_haversine.nx" 12import "nx_geo_distance.nx" 13import "nx_syscalls.nx" 14 15const GH_LOG: *u8 = "knowledge/status/geo_haversine.log" 16 17func gh_w(fd: i64, s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(fd, s, n); return 0 } 18func gh_wn(fd: i64, v: i64) -> i64 { let bb: *u8 = sys_mmap(28); var m: i64=v; if m<0 {m=0-m; sys_write(fd,"-" as *u8,1)}; let t: *u8 = sys_mmap(28); var k: i64=0; if m==0 {t[0]=48;k=1}; while m>0 {t[k]=(48+(m%10)) as u8; m=m/10; k=k+1}; var i: i64=0; while i<k {bb[i]=t[k-1-i]; i=i+1}; sys_write(fd, bb, k); return 0 } 19 20func gh_abs(x: i64) -> i64 { if x < 0 { return 0 - x } return x } 21// |a - b| <= b * num / den ? 22func gh_relnear(a: i64, b: i64, num: i64, den: i64) -> i64 { if gh_abs(a - b) * den <= b * num { return 1 } return 0 } 23 24func gh_emit(fd: i64, zero: i64, lon: i64, syd: i64, equi: i64, haverr: i64, equierr: i64, ok: i64) -> i64 { 25 gh_w(fd, "GEOHAVGATE authored=organ method=cordic-haversine same_point=" as *u8); gh_wn(fd, zero) 26 gh_w(fd, " nyc_london_m=" as *u8); gh_wn(fd, lon) 27 gh_w(fd, " nyc_sydney_hav_m=" as *u8); gh_wn(fd, syd) 28 gh_w(fd, " nyc_sydney_equi_m=" as *u8); gh_wn(fd, equi) 29 gh_w(fd, " hav_err_m=" as *u8); gh_wn(fd, haverr) 30 gh_w(fd, " equi_err_m=" as *u8); gh_wn(fd, equierr) 31 if ok == 1 { gh_w(fd, " verdict=GREEN\n" as *u8) } else { gh_w(fd, " verdict=RED\n" as *u8) } 32 return 0 33} 34 35func main() -> i64 { 36 let nyc_lat: i64 = 40712800 37 let nyc_lon: i64 = 0 - 74006000 38 let lon_lat: i64 = 51507400 39 let lon_lon: i64 = 0 - 127800 40 let syd_lat: i64 = 0 - 33868800 41 let syd_lon: i64 = 151209300 42 43 let zero: i64 = geo_haversine_m(nyc_lat, nyc_lon, nyc_lat, nyc_lon) // expect 0 44 let d_lon: i64 = geo_haversine_m(nyc_lat, nyc_lon, lon_lat, lon_lon) // ~5,570,000 m 45 let d_syd: i64 = geo_haversine_m(nyc_lat, nyc_lon, syd_lat, syd_lon) // ~15,990,000 m 46 let d_syd_equi: i64 = geo_distance_m(nyc_lat, nyc_lon, syd_lat, syd_lon) // flat-earth baseline 47 48 let true_lon: i64 = 5570000 49 let true_syd: i64 = 15990000 50 let hav_err: i64 = gh_abs(d_syd - true_syd) 51 let equi_err: i64 = gh_abs(d_syd_equi - true_syd) 52 53 var ok: i64 = 1 54 if zero != 0 { ok = 0 } 55 if gh_relnear(d_lon, true_lon, 2, 100) != 1 { ok = 0 } // within 2% 56 if gh_relnear(d_syd, true_syd, 2, 100) != 1 { ok = 0 } // within 2% 57 if hav_err >= equi_err { ok = 0 } // MEASURED exceed: haversine strictly closer 58 59 gh_emit(1, zero, d_lon, d_syd, d_syd_equi, hav_err, equi_err, ok) 60 let lf: i64 = sys_openat_append(GH_LOG, 420) 61 if lf >= 0 { gh_emit(lf, zero, d_lon, d_syd, d_syd_equi, hav_err, equi_err, ok); sys_close(lf) } 62 63 if ok == 1 { return 0 } 64 return 1 65}