diff --git a/fx_s1516 b/fx_s1516 new file mode 160000 index 0000000000000000000000000000000000000000..2f4b31aab1ff4b7689ebd3278d1d93e8dc9195ac --- /dev/null +++ b/fx_s1516 @@ -0,0 +1 @@ +Subproject commit 2f4b31aab1ff4b7689ebd3278d1d93e8dc9195ac diff --git a/fx_s1516_longlong.h b/fx_s1516_longlong.h deleted file mode 100644 index cc6b2c7c00edd2ee5661dc9afe3dcd0006bd8f5c..0000000000000000000000000000000000000000 --- a/fx_s1516_longlong.h +++ /dev/null @@ -1,16 +0,0 @@ -#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/fx_s1516_longlong.c b/fx_s1516_longlong/fx_s1516_longlong.c similarity index 100% rename from fx_s1516_longlong.c rename to fx_s1516_longlong/fx_s1516_longlong.c diff --git a/fx_s1516_longlong/fx_s1516_longlong.h b/fx_s1516_longlong/fx_s1516_longlong.h new file mode 100644 index 0000000000000000000000000000000000000000..af4313e3010bcbf5ebd7584bea2cf1e0c97ab36a --- /dev/null +++ b/fx_s1516_longlong/fx_s1516_longlong.h @@ -0,0 +1,38 @@ +#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 문도 많이 돌려보고 +// 값도 아주 작은 거부터 아주 큰거까지 다 넣어보고 + +#define div0(a, b) (fixed32)(((fixed64)(a) << 16) / (b)) +#define div1(a, b) ((((a) << 8) / (b)) << 8) +#define div2(a, b) ((a) / ((b) >> 16)) + +// 나눗셈 연산 : shift 과정에서 나누는 수가 0이 되어 나눠질 수 있으므로 조심해야 한다. + +/* <div0> +* a(나눠지는 수)를 long long으로 캐스팅, 16bit shift 연산 후 b(나누는 수)로 나눔 +* long long 캐스팅: int(32bit)인 a를 long long(64bit)로 캐스팅함으로써 속도가 느려지지만 16bit shift 연산을 할 때 데이터의 손실을 줄일 수 있다. +* fx_s1516_longlong은 정수형 사칙연산이므로 a와 b가 비슷한 범위의 숫자이거나 실수형으로 계산했을 때 소수점이 나오는 나눗셈인 경우 오차범위가 커지기 때문에 이것을 방지하고자 미리 a를 16bit shift 시킨 후 b로 나눴다. + + <div1> +* long long으로 캐스팅하지 않고 int형으로 나눠줬기 때문에 연산 속도가 빠르다. +* 큰 수일 경우 데이터의 손실이 있을 수 있다. +* Overflow 가능성은 작아진다. + + <div2> +* div1과 같이 long long으로 캐스팅하지 않았기 때문에 연산 속도가 빠르다. +* Overflow 발생확률이 높다. +* b(나누는 수)가 작은 수일 경우 데이터의 손실이 크다. +*/ \ No newline at end of file