nx_fbx_affine_math_gate_t32.nx source
↩ module page · 21 lines · 1157 B
1import "nx_f32_sincos.nx"
2import "nx_vecmath.nx"
3import "nx_fbx_bind.nx"
4import "nx_nxa_write_lib.nx"
5func main()->i64 {
6 let angle:*i64=sys_mmap(64) as *i64
7 let expected:*i64=sys_mmap(128) as *i64
8 angle[0]=0;expected[0]=0;expected[1]=1048576
9 angle[1]=31457280;expected[2]=524288;expected[3]=908093
10 angle[2]=47185920;expected[4]=741455;expected[5]=741455
11 angle[3]=94371840;expected[6]=1048576;expected[7]=0
12 angle[4]=-94371840;expected[8]=-1048576;expected[9]=0
13 angle[5]=188743680;expected[10]=0;expected[11]=-1048576
14 angle[6]=-188462766;expected[12]=-4903;expected[13]=-1048565
15 angle[7]=143983116;expected[14]=710927;expected[15]=-770775
16 var maximum:i64=0;var i:i64=0
17 while i<8 {let radians:i64=nx_f32_mul(vm_int_to_f32(angle[i],FBB_Q),1016003125);let sn:i64=vm_f32_to_int(nx_f32_sin(radians),FBB_Q);let cs:i64=vm_f32_to_int(nx_f32_cos(radians),FBB_Q);var ds:i64=sn-expected[i*2];if ds<0{ds=0-ds};var dc:i64=cs-expected[i*2+1];if dc<0{dc=0-dc};if ds>maximum{maximum=ds};if dc>maximum{maximum=dc};i=i+1}
18 if maximum>16{return 3}
19 sys_write(1,"PASS existing f32 sin/cos Q20 absolute error <=16 on eight independent angles\n" as *u8,75)
20 return 0
21}