code wiki / (root) / nx_q14_math_test.nx

nx_q14_math_test.nx source

↩ module page · 99 lines · 3646 B

1// nx_q14_math_test.nx -- smoke for nx_q14_math. 2 3import "nx_syscalls.nx" 4import "nx_q14_math.nx" 5 6func main() -> i64 { 7 if NX_Q14 != 16384 { return 1 } 8 9 // abs / sign 10 if nx_q14_abs(0 - 5000) != 5000 { return 2 } 11 if nx_q14_abs(5000) != 5000 { return 3 } 12 if nx_q14_sign(5000) != 1 { return 4 } 13 if nx_q14_sign(0 - 5000) != -1 { return 5 } 14 if nx_q14_sign(0) != 0 { return 6 } 15 16 // clamp 17 if nx_q14_clamp(5000, 0, 1000) != 1000 { return 7 } 18 if nx_q14_clamp(0 - 5000, 0, 1000) != 0 { return 8 } 19 if nx_q14_clamp(500, 0, 1000) != 500 { return 9 } 20 21 // mul / div 22 // 0.5 * 0.5 = 0.25 in Q14: 8192 * 8192 / 16384 = 4096 23 if nx_q14_mul(8192, 8192) != 4096 { return 10 } 24 // 1.0 / 2.0 in Q14 = 0.5 = 8192 25 if nx_q14_div(NX_Q14, 2 * NX_Q14) != 8192 { return 11 } 26 if nx_q14_div(0, 5) != 0 { return 12 } 27 if nx_q14_div(100, 0) != 0 { return 13 } // div by zero -> 0 28 29 // sqrt 30 // sqrt(1.0) = 1.0 (Q14) 31 let s_one: nx_int = nx_q14_sqrt(NX_Q14) 32 if s_one < 16000 { return 14 } 33 if s_one > 16800 { return 15 } 34 // sqrt(4.0) = 2.0 in Q14: sqrt(4*16384) = sqrt(65536) = 256 = wait that's wrong 35 // sqrt of Q14 value v that represents R is sqrt(v*16384) / 16384 ... actually: 36 // Q14 sqrt: input v is Q14 representation of R; output is Q14 representation of sqrt(R). 37 // For R=4 (input=65536), expected output is 2.0 = 32768. 38 let s_four: nx_int = nx_q14_sqrt(4 * NX_Q14) 39 if s_four < 32000 { return 16 } 40 if s_four > 33500 { return 17 } 41 // sqrt(0) = 0 42 if nx_q14_sqrt(0) != 0 { return 18 } 43 // sqrt of negative -> 0 44 if nx_q14_sqrt(0 - 5) != 0 { return 19 } 45 46 // sin / cos values within tolerance 47 // sin(0) ~ 0 48 let s0: nx_int = nx_q14_sin(0) 49 if nx_q14_abs(s0) > 500 { return 20 } // within ~3% of zero 50 // cos(0) ~ 1.0 51 let c0: nx_int = nx_q14_cos(0) 52 if c0 < 15000 { return 21 } 53 if c0 > 17000 { return 22 } 54 // sin(π/2) ~ 1.0 (π/2 in Q14 = 25736) 55 let sh: nx_int = nx_q14_sin(NX_Q14_2PI / 4) 56 if sh < 15000 { return 23 } 57 if sh > 17000 { return 24 } 58 // cos(π/2) ~ 0 59 let ch: nx_int = nx_q14_cos(NX_Q14_2PI / 4) 60 if nx_q14_abs(ch) > 500 { return 25 } 61 62 // dot product: (1,0,0) . (1,0,0) = 1 in Q14 63 let dot_xx: nx_int = nx_q14_vec3_dot(NX_Q14, 0, 0, NX_Q14, 0, 0) 64 if dot_xx < 16000 { return 26 } 65 if dot_xx > 16800 { return 27 } 66 // (1,0,0) . (0,1,0) = 0 67 let dot_xy: nx_int = nx_q14_vec3_dot(NX_Q14, 0, 0, 0, NX_Q14, 0) 68 if nx_q14_abs(dot_xy) > 500 { return 28 } 69 70 // length of (1,0,0) = 1 71 let len_x: nx_int = nx_q14_vec3_length(NX_Q14, 0, 0) 72 if len_x < 16000 { return 29 } 73 if len_x > 16800 { return 30 } 74 75 // normalize (3,4,0) -> (0.6, 0.8, 0) since length = 5 76 let nx_out: *i64 = (sys_mmap(8)) as *i64 77 let ny_out: *i64 = (sys_mmap(8)) as *i64 78 let nz_out: *i64 = (sys_mmap(8)) as *i64 79 nx_q14_vec3_normalize(3 * NX_Q14, 4 * NX_Q14, 0, nx_out, ny_out, nz_out) 80 // 0.6 in Q14 = 9830 (approx) 81 if nx_out[0] < 9000 { return 31 } 82 if nx_out[0] > 10500 { return 32 } 83 // 0.8 in Q14 = 13107 (approx) 84 if ny_out[0] < 12500 { return 33 } 85 if ny_out[0] > 13500 { return 34 } 86 if nz_out[0] != 0 { return 35 } 87 88 // cross (1,0,0) x (0,1,0) = (0,0,1) 89 let cx_out: *i64 = (sys_mmap(8)) as *i64 90 let cy_out: *i64 = (sys_mmap(8)) as *i64 91 let cz_out: *i64 = (sys_mmap(8)) as *i64 92 nx_q14_vec3_cross(NX_Q14, 0, 0, 0, NX_Q14, 0, cx_out, cy_out, cz_out) 93 if cx_out[0] != 0 { return 36 } 94 if cy_out[0] != 0 { return 37 } 95 if cz_out[0] < 16000 { return 38 } 96 if cz_out[0] > 16800 { return 39 } 97 98 return 0 99}