code wiki / (root) / nx_fbx_affine_math_gate_t32.nx

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}