diff --git a/fx_s1516.zip b/fx_s1516.zip new file mode 100644 index 0000000000000000000000000000000000000000..70ef6a774dcd41ddffca313134466ff6361c5187 Binary files /dev/null and b/fx_s1516.zip differ diff --git a/fx_s1516_longlong.c b/fx_s1516_longlong.c new file mode 100644 index 0000000000000000000000000000000000000000..c8069f20b8f1e9aa861f977dcf36480ec4ba72bf --- /dev/null +++ b/fx_s1516_longlong.c @@ -0,0 +1,37 @@ +//fx_1516_longlong.c file +#include "fx_s1516_longlong.h" +#define FX32_90 0x005A0000 +#define FX32_180 0x00B40000 +#define FX32_360 0x01680000 + +// sin table +const fixed32 fx32_SinTable[92] = + { + 0,1143,2287,3429,4571,5711,6850,7986,9120,10252,11380,12504,13625,14742,15854,16961,18064,19160,20251,21336,22414,23486,24550,25606,26655, 27696,28729,29752, + 30767,31772,32768,33753,34728,35693,36647,37589,38521,39440,40347,41243,42125,42995,43852,44695,45525,46340,47142, 47929,48702,49460,50203,50931,51643,52339, + 53019,53683,54331,54963,55577,56175,56755,57319,57864,58393,58903,59395,59870,60326,60763, 61183,61583,61965,62328,62672,62997,63302,63589,63856,64103,64331, + 64540,64729,64898,65047,65176,65286,65376,65446,65496,65526,65536,65526 + }; + +fx_s1516_sin(fixed32 fa){ + int sign = 1; + fixed32 ret0, diff; + int idx; + if ( fa < 0 ) + { + sign = -1; + fa *= -1; + } + fa = fa % FX32_360; + if ( fa >= FX32_180 ) + { + sign *= -1; + fa -= FX32_180; + } + if ( fa > FX32_90 ) + fa = FX32_180 - fa; + idx = fa>>16; + ret0 = fx32_SinTable[idx]; + diff = fx32_SinTable[idx+1]-ret0; + return ( sign *( ret0 + ((diff*(fa&0xFFFF))>>16) )); +} \ No newline at end of file diff --git a/fx_s1516_longlong.h b/fx_s1516_longlong.h new file mode 100644 index 0000000000000000000000000000000000000000..cc6b2c7c00edd2ee5661dc9afe3dcd0006bd8f5c --- /dev/null +++ b/fx_s1516_longlong.h @@ -0,0 +1,16 @@ +#pragma once + +typedef long fixed32; +typedef long long fixed64; + +#define mul0(a, b) (fixed32) ((fixed64)(a) * (b) >> 16) +#define mul1(a, b) (fixed32) ((a) * (b) >> 16) // no fixed +#define mul2(a, b) (fixed32) ((a>>8) * (b>>8)) +#define mul3(a, b) (fixed32) ((a>>10) * (b>>6)) +#define mul4(a, b) (fixed32) ((a>>4) * (b>>4) >> 8) + +// mul에서 (fixed) conversion 안하면 : 숫자가 -1 부터 1로 (작게)정규화 되어있으면 곱셈이 빠르다. +// fixed도 붙였다 땠다 해보고 +// 시프트 연산도 나눠보고 +// for 문도 많이 돌려보고 +// 값도 아주 작은 거부터 아주 큰거까지 다 넣어보고 \ No newline at end of file diff --git a/longtest.c b/longtest.c new file mode 100644 index 0000000000000000000000000000000000000000..01b019aac0e93eec221e4282edc5faab95ee147c --- /dev/null +++ b/longtest.c @@ -0,0 +1,15 @@ +#include "fx_s1516_longlong.h" +#include <stdio.h> + +int main() +{ + long long a = 3000000; + long long b = 5000000; + + printf("mul0 : %d\n", mul1(a, b)); + printf("mul1 : %d\n", mul1(a, b)); + printf("mul2 : %d\n", mul2(a, b)); + printf("mul3 : %d\n", mul3(a, b)); + printf("mul4 : %d\n", mul4(a, b)); + +} \ No newline at end of file