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}