code wiki / (root) / nx_i128_test.nx

nx_i128_test.nx source

↩ module page · 47 lines · 1645 B

1// nx_i128_test.nx -- smoke test for nx_i128.nx. 2// Exits 0 on success; non-zero codes flag specific failure modes. 3 4import "syscalls.nx" 5import "nx_i128.nx" 6 7func main() -> i64 { 8 // Test 1: nx_muldiv_i64 with values that overflow i64. 9 // a * b = 1_000_000_000 * 1_000_000_000 = 1e18; fits i64 narrowly. 10 // a * b * 4 = 4e18; fits i64 but no headroom. 11 // a * b * 10 = 1e19; OVERFLOWS i64. 12 // Verify (1e9 * 1e9 * 10) / 1e9 = 1e10 via i128 intermediate. 13 let a: i64 = 1000000000 14 let b: i64 = 1000000000 15 let c: i64 = 100000000 16 // a*b = 1e18; (a*b)/c = 1e18 / 1e8 = 1e10 17 let q1: i64 = nx_muldiv_i64(a, b, c) 18 if q1 != 10000000000 { return 11 } 19 20 // Test 2: muldiv with overflow case. a*b/c where a*b > i64. 21 // a = 2^62 = 4.6e18, b = 4, c = 8. a*b = 1.8e19 > i64 max. 22 // Result: a*b/c = 2^62 = 4.6e18. Fits i64. 23 let a2: i64 = 4611686018427387904 // 2^62 24 let b2: i64 = 4 25 let c2: i64 = 8 26 let q2: i64 = nx_muldiv_i64(a2, b2, c2) 27 if q2 != 2305843009213693952 { return 12 } // 2^61 28 29 // Test 3: nx_mulshl_div_i64 -- Q12 ratio. 30 // (3 * 7 << 12) / 1 = 21 * 4096 = 86016 31 let q3: i64 = nx_mulshl_div_i64(3, 7, 12, 1) 32 if q3 != 86016 { return 13 } 33 34 // Test 4: signed. 35 let q4: i64 = nx_muldiv_i64(-1000000000, 1000000000, 100000000) 36 if q4 != -10000000000 { return 14 } 37 38 // Test 5: zero. 39 let q5: i64 = nx_muldiv_i64(0, 1000000, 7) 40 if q5 != 0 { return 15 } 41 42 // Test 6: simple sanity (no overflow). 43 let q6: i64 = nx_muldiv_i64(100, 200, 5) 44 if q6 != 4000 { return 16 } 45 46 return 0 47}