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}