diff --git a/a.exe b/a.exe deleted file mode 100644 index 79f45934e2dfa7ac250c443b2318107f766fbbf0..0000000000000000000000000000000000000000 Binary files a/a.exe and /dev/null differ diff --git a/fx_3132.c b/fx_3132.c deleted file mode 100644 index 4687baf122781eca9a800101af1fdb7fae38df5a..0000000000000000000000000000000000000000 --- a/fx_3132.c +++ /dev/null @@ -1,20 +0,0 @@ -#include <stdio.h> -#include <math.h> -#include "fx_s3132.h" - -fx_3132 sin2(fx_3132 a) { - return double_to_fx(sin(fx_to_double(a))); -}; -fx_3132 sqrt2(fx_3132 a) { - return double_to_fx(sqrt(fx_to_double(a))); -}; -fx_3132 power2(fx_3132 a, fx_3132 b) { - return double_to_fx(pow(fx_to_double(a), fx_to_double(b))); -}; - -fx_3132 pi2() { - return double_to_fx(fx_to_double(PI)); -}; -fx_3132 piReverse2() { - return double_to_fx((fx_to_double(1 / PI))); -}; diff --git a/fx_s3132.h b/fx_s3132.h deleted file mode 100644 index b80f7c1e3358653449b3d2d88721efb838121ddd..0000000000000000000000000000000000000000 --- a/fx_s3132.h +++ /dev/null @@ -1,28 +0,0 @@ -#include <stdio.h> -#include <math.h> -#define P2_2to32 4294967296.0 -#define PI 3.141592653 -#define fx_to_double(a) (a/P2_2to32) -#define double_to_fx(a) (long long)(a*P2_2to32) -#define fx_add(a, b) ((a)+(b)) -#define fx_sub(a, b) ((a)-(b)) -#define fx_mul(a, b) double_to_fx(fx_to_double (a) * fx_to_double (b)) -#define fx_mul2(a, b) (double)a * (double)b / P2_2to32 -#define fx_div(a, b) double_to_fx(fx_to_double (a) / fx_to_double (b)) -#define fx_sin(a) double_to_fx(sin(fx_to_double(a))) -#define fx_sqrt(a) double_to_fx(sqrt(fx_to_double(a))) -#define fx_power(a, b) double_to_fx(pow(fx_to_double(a), fx_to_double(b))) -#define fx_log10(a) double_to_fx(log10(fx_to_double(a))) -#define fx_ln(a) double_to_fx(log(fx_to_double(a))) -#define fx_PI() (double_to_fx(PI)) -#define fx_PI_Reverse() (double_to_fx((1/PI))) - -typedef long long fx_3132; - -fx_3132 sin2(fx_3132 a); -fx_3132 sqrt2(fx_3132 a); -fx_3132 power2(fx_3132 a, fx_3132 b); - -fx_3132 piReverse2(); -fx_3132 pi2(); - diff --git a/fx_s3132_double.c b/fx_s3132_double.c index bccbbdc8e1b850a54819d32b3f76b09c35ca0c10..af8dbc4bcbca6e289c192664972739b8f7b346f5 100644 --- a/fx_s3132_double.c +++ b/fx_s3132_double.c @@ -1,7 +1,41 @@ #include <stdio.h> -#include "fx_3132.h" - -int main(){ - printf("두 이진수를 입력 하시오"); +#include "fx_s3132_double.h" +fx_s3132 fx_s3132_fx_to_double(fx_s3132 a) { + return _FX_S3132_FX_TO_DOUBLE(a); +} +fx_s3132 fx_s3132_double_to_fx(fx_s3132 a) { + return _FX_S3132_DOUBLE_TO_FX(a); +} +fx_s3132 fx_s3132_add(fx_s3132 a, fx_s3132 b) { + return _FX_S3132_ADD(a, b); +} +fx_s3132 fx_s3132_sub(fx_s3132 a, fx_s3132 b) { + return _FX_S3132_SUB(a, b); +} +fx_s3132 fx_s3132_mul(fx_s3132 a, fx_s3132 b) { + return _FX_S3132_MUL(a, b); +} +fx_s3132 fx_s3132_div(fx_s3132 a, fx_s3132 b) { + return _FX_S3132_DIV(a, b); +} +fx_s3132 fx_s3132_sin(fx_s3132 a) { + return _FX_S3132_SIN(a); +} +fx_s3132 fx_s3132_sqrt(fx_s3132 a) { + return _FX_S3132_SQRT(a); +} +fx_s3132 fx_s3132_power(fx_s3132 a, fx_s3132 b) { + return _FX_S3132_POWER(a, b); +} +fx_s3132 fx_s3132_log(fx_s3132 a) { + return _FX_S3132_LOG(a); +} +fx_s3132 fx_s3132_ln(fx_s3132 a) { + return _FX_S3132_LN(a); +} +fx_s3132 fx_s3132_pi() { + return _FX_S3132_PI(); +} +fx_s3132 fx_s3132_pi_reverse() { + return _FX_S3132_PI_REVERSE(); } - diff --git a/fx_s3132_double.h b/fx_s3132_double.h new file mode 100644 index 0000000000000000000000000000000000000000..39bd6b3320172c78bd551485f3120b55a9110fe0 --- /dev/null +++ b/fx_s3132_double.h @@ -0,0 +1,19 @@ +#include <stdio.h> +#include <math.h> +#define P_2TO32 4294967296.0 +#define PI 3.141592653 +#define _FX_S3132_FX_TO_DOUBLE(a) (a/P_2TO32) +#define _FX_S3132_DOUBLE_TO_FX(a) (long long)(a*P_2TO32) +#define _FX_S3132_ADD(a, b) ((a)+(b)) +#define _FX_S3132_SUB(a, b) ((a)-(b)) +#define _FX_S3132_MUL(a, b) _FX_S3132_DOUBLE_TO_FX(_FX_S3132_FX_TO_DOUBLE (a) * _FX_S3132_FX_TO_DOUBLE (b)) +#define _FX_S3132_DIV(a, b) _FX_S3132_DOUBLE_TO_FX(_FX_S3132_FX_TO_DOUBLE (a) / _FX_S3132_FX_TO_DOUBLE (b)) +#define _FX_S3132_SIN(a) _FX_S3132_DOUBLE_TO_FX(sin(_FX_S3132_FX_TO_DOUBLE(a))) +#define _FX_S3132_SQRT(a) _FX_S3132_DOUBLE_TO_FX(sqrt(_FX_S3132_FX_TO_DOUBLE(a))) +#define _FX_S3132_POWER(a, b) _FX_S3132_DOUBLE_TO_FX(pow(_FX_S3132_FX_TO_DOUBLE(a), _FX_S3132_FX_TO_DOUBLE(b))) +#define _FX_S3132_LOG(a) _FX_S3132_DOUBLE_TO_FX(log10(_FX_S3132_FX_TO_DOUBLE(a))) +#define _FX_S3132_LN(a) _FX_S3132_DOUBLE_TO_FX(log(_FX_S3132_FX_TO_DOUBLE(a))) +#define _FX_S3132_PI() (_FX_S3132_DOUBLE_TO_FX(PI)) +#define _FX_S3132_PI_REVERSE() (_FX_S3132_DOUBLE_TO_FX((1/PI))) + +typedef long long fx_s3132; diff --git a/step2/fx_s3132_longlong.c b/step2/fx_s3132_longlong.c index 83ef190587fd07c9d71ab10bba6a1015b8711cef..b68361d8bd1bfd88d883f57b61878c860e4fce1b 100644 --- a/step2/fx_s3132_longlong.c +++ b/step2/fx_s3132_longlong.c @@ -1,8 +1,8 @@ #include "fx_s3132_longlong.h" -#if defined(__FX32__) +#if defined(__FX_S3132__) -const fixed32 fx32_SinTable[92] = +const fixed32 fx_s3132_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, @@ -21,19 +21,37 @@ fixed32 fx32_sind(fixed32 fa) sign = -1; fa *= -1; } - fa = fa % FX32_360; - if ( fa >= FX32_180 ) + fa = fa % _FX_S3132_360; + if ( fa >= _FX_S3132_180 ) { sign *= -1; - fa -= FX32_180; + fa -= _FX_S3132_180; } - if ( fa > FX32_90 ) - fa = FX32_180 - fa; + if ( fa > _FX_S3132_90 ) + fa = _FX_S3132_180 - fa; idx = fa>>16; - ret0 = fx32_SinTable[idx]; - diff = fx32_SinTable[idx+1]-ret0; + ret0 = fx_s3132_SinTable[idx]; + diff = fx_s3132_SinTable[idx+1]-ret0; return ( sign *( ret0 + ((diff*(fa&0xFFFF))>>16) )); } +fx_s3132 fx_s3132_mul(fx_s3132 a, fx_s3132 b) { + return _FX_S3132_mul(a, b); +} +fx_s3132 fx_s3132_mul1(fx_s3132 a, fx_s3132 b) { + return _FX_S3132_mul1(a, b); +} +fx_s3132 fx_s3132_mul2(fx_s3132 a, fx_s3132 b) { + return _FX_S3132_mul2(a, b); +} +fx_s3132 fx_s3132_div(fx_s3132 a, fx_s3132 b) { + return _FX_S3132_div(a, b); +} +fx_s3132 fx_s3132_div1(fx_s3132 a, fx_s3132 b) { + return _FX_S3132_div1(a, b); +} +fx_s3132 fx_s3132_div2(fx_s3132 a, fx_s3132 b) { + return _FX_S3132_div2(a, b); +} #endif diff --git a/step2/fx_s3132_longlong.h b/step2/fx_s3132_longlong.h index b1fa41866286a203c83f948e2cc82e2b449020f5..3d1dadbb018a7f0b5a70847fe80117839cb022ce 100644 --- a/step2/fx_s3132_longlong.h +++ b/step2/fx_s3132_longlong.h @@ -9,33 +9,33 @@ typedef long long fx_s3132; -#define __FX32__ -#define FX32_QNUM 32 -#define FX32_QMULT 4294967296 -#define FLOAT_QMULT 4294967296.0F -#define FX32_180_PI 0x00394BB8 -#define FX32_1 0x00010000 -#define FX32_30 0x001E0000 -#define FX32_45 0x002D0000 -#define FX32_90 0x005A0000 -#define FX32_180 0x00B40000 -#define FX32_360 0x01680000 +#define __FX_S3132__ +#define _FX_S3132_QNUM 32 +#define _FX_S3132_QMULT 4294967296 +#define _FX_S3132_FLOAT_QMULT 4294967296.0F +#define _FX_S3132_180_PI 0x00394BB8 +#define _FX_S3132_1 0x00010000 +#define _FX_S3132_30 0x001E0000 +#define _FX_S3132_45 0x002D0000 +#define _FX_S3132_90 0x005A0000 +#define _FX_S3132_180 0x00B40000 +#define _FX_S3132_360 0x01680000 //아래 3개는 곱셈 관련 코드입니다. -#define fx32_mul(fa, fb) ((fa * fb) >> FX32_QNUM ) //fa와 fb를 곱해서 2^32로 나누어 주는 코드입니다. 이게 가장 기본 코드입니다. -#define fx32_mul1(fa, fb) ((((fa>>16) * fb)>>16)) //위와 똑같이 fa*fb>>32랑 같은 의미인대, 먼저 fa/2^16와 fb를 곱해주고 나머지 2^16을 나눠주는 작업입니다. -#define fx32_mul2(fa, fb) ((((fa>>8)*(fb>>8))>>16)) //위와 똑같이 fa*fb>>32랑 같은 의미인대, 먼저 fa/2^8, fb/2^8을 곱해주고 나머지 2^16을 나눠주는 작업입니다. +#define _FX_S3132_mul(fa, fb) ((fa * fb) >> _FX_S3132_QNUM ) //fa와 fb를 곱해서 2^32로 나누어 주는 코드입니다. 이게 가장 기본 코드입니다. +#define _FX_S3132_mul1(fa, fb) ((((fa>>16) * fb)>>16)) //위와 똑같이 fa*fb>>32랑 같은 의미인대, 먼저 fa/2^16와 fb를 곱해주고 나머지 2^16을 나눠주는 작업입니다. +#define _FX_S3132_mul2(fa, fb) ((((fa>>8)*(fb>>8))>>16)) //위와 똑같이 fa*fb>>32랑 같은 의미인대, 먼저 fa/2^8, fb/2^8을 곱해주고 나머지 2^16을 나눠주는 작업입니다. //아래 3개는 나눗셈 관련 코드입니다. -#define fx32_div(fa, fb) ( (((fixed64)(fa) << FX32_QNUM) /(fb))) //fa에 2^32을 곱하고 fb를 나눠주는 코드입니다. 이게 가장 기본 코드입니다. -#define fx32_div1(fa, fb) ((((fa)<<16)/(fb))<<16) //위와 똑같이 (fa<<32)/fb랑 같은 의미인대, 먼저 fa에 2^16을 곱한 값을 fb를 나누고, 그 다음에 나머지 2^16을 곱해주는 작업입니다. -#define fx32_div2(fa, fb) ((((fa)<<24)/(fb))<<8) //위와 똑같이 (fa<<32)/fb랑 같은 의미인대, 먼저 fa에 2^24을 곱한 값을 fb를 나누고, 그 다음에 나머지 2^8을 곱해주는 작업입니다. - //((fa)/((fb)>>FX32_QNUM)) +#define _FX_S3132_div(fa, fb) ( (((fa) << _FX_S3132_QNUM) /(fb))) //fa에 2^32을 곱하고 fb를 나눠주는 코드입니다. 이게 가장 기본 코드입니다. +#define _FX_S3132_div1(fa, fb) ((((fa)<<16)/(fb))<<16) //위와 똑같이 (fa<<32)/fb랑 같은 의미인대, 먼저 fa에 2^16을 곱한 값을 fb를 나누고, 그 다음에 나머지 2^16을 곱해주는 작업입니다. +#define _FX_S3132_div2(fa, fb) ((((fa)<<24)/(fb))<<8) //위와 똑같이 (fa<<32)/fb랑 같은 의미인대, 먼저 fa에 2^24을 곱한 값을 fb를 나누고, 그 다음에 나머지 2^8을 곱해주는 작업입니다. + //((fa)/((fb)>>_FX_S3132_QNUM)) -#define fx32_degree(__r) (fx32_mul((__r),FX32_180_PI)) +#define _FX_S3132_DEGREE(__r) (_FX_S3132_mul((__r),_FX_S3132_180_PI)) -#define fx32_asin(__a) fx32_asind(fx32_degree(__a)) +#define _FX_S3132_ASIN(__a) fx32_asind(_FX_S3132_DEGREE(__a)) fixed32 fx32_sind(fixed32 fa); diff --git a/step2/test.c b/step2/test.c index 2fb82529afeb600bfc18d092692bd8af7964ef61..552a22917fd4ed7d4d113ba116f4df6df0677f1d 100644 --- a/step2/test.c +++ b/step2/test.c @@ -2,29 +2,12 @@ #include "fx_s3132_longlong.h" #define Max 10000000 -void fx_s3132_longlong_mul(fx_s3132 fa, fx_s3132 fb) { - fx32_mul(fa, fb); -} - -void fx_s3132_longlong_mul1(fx_s3132 fa, fx_s3132 fb) { - fx32_mul1(fa, fb); -} - -void fx_s3132_longlong_mul2(fx_s3132 fa, fx_s3132 fb) { - fx32_mul2(fa, fb); -} - -void fx_s3132_longlong_div(fx_s3132 fa, fx_s3132 fb) { - fx32_div(fa, fb); -} - -void fx_s3132_longlong_div1(fx_s3132 fa, fx_s3132 fb) { - fx32_div1(fa, fb); -} - -void fx_s3132_longlong_div2(fx_s3132 fa, fx_s3132 fb) { - fx32_div2(fa, fb); -} +extern fx_s3132 fx_s3132_mul(fx_s3132 fa, fx_s3132 fb); +extern fx_s3132 fx_s3132_mul1(fx_s3132 fa, fx_s3132 fb); +extern fx_s3132 fx_s3132_mul2(fx_s3132 fa, fx_s3132 fb); +extern fx_s3132 fx_s3132_div(fx_s3132 fa, fx_s3132 fb); +extern fx_s3132 fx_s3132_div1(fx_s3132 fa, fx_s3132 fb); +extern fx_s3132 fx_s3132_div2(fx_s3132 fa, fx_s3132 fb); int main() { @@ -49,33 +32,33 @@ int main() { if (choose == 1) { - printf("Mul: %lld\n", fx32_mul(num1, num2)); - printf("Mul1: %lld\n", fx32_mul1(num1, num2)); - printf("Mul2: %lld\n", fx32_mul2(num1, num2)); + printf("Mul: %lld\n", fx_s3132_mul(num1, num2)); + printf("Mul1: %lld\n", fx_s3132_mul1(num1, num2)); + printf("Mul2: %lld\n", fx_s3132_mul2(num1, num2)); for (int i = 0; i < Max; i++) { - fx_s3132_longlong_mul(num1, num2); + fx_s3132_mul(num1, num2); } for (int i = 0; i < Max; i++) { - fx_s3132_longlong_mul1(num1, num2); + fx_s3132_mul1(num1, num2); } for (int i = 0; i < Max; i++) { - fx_s3132_longlong_mul2(num1, num2); + fx_s3132_mul2(num1, num2); } } else if (choose == 2) { - printf("Div: %lld\n", fx32_div(num1, num2)); - printf("Div1: %lld\n", fx32_div1(num1, num2)); - printf("Div2: %lld\n", fx32_div2(num1, num2)); + printf("Div: %lld\n", fx_s3132_div(num1, num2)); + printf("Div1: %lld\n", fx_s3132_div1(num1, num2)); + printf("Div2: %lld\n", fx_s3132_div2(num1, num2)); for (int i = 0; i < Max; i++) { - fx_s3132_longlong_div(num1, num2); + fx_s3132_div(num1, num2); } for (int i = 0; i < Max; i++) { - fx_s3132_longlong_div1(num1, num2); + fx_s3132_div1(num1, num2); } for (int i = 0; i < Max; i++) { - fx_s3132_longlong_div2(num1, num2); + fx_s3132_div2(num1, num2); } }if (choose == 3) { printf("Sin : %ld\n", fx32_sind(num1)); diff --git a/test.c b/test.c index 82f2cc564e42d08bb98300d7c4053fd0a6107632..1b1d330c42d3690fb2607696ccd07f4fb37a2564 100644 --- a/test.c +++ b/test.c @@ -1,6 +1,20 @@ #include <stdio.h> #include <math.h> -#include "fx_s3132.h" +#include "fx_s3132_double.h" + +extern fx_s3132 fx_s3132_fx_to_double(fx_s3132 a); +extern fx_s3132 fx_s3132_double_to_fx(fx_s3132 a); +extern fx_s3132 fx_s3132_add(fx_s3132 a, fx_s3132 b); +extern fx_s3132 fx_s3132_sub(fx_s3132 a, fx_s3132 b); +extern fx_s3132 fx_s3132_mul(fx_s3132 a, fx_s3132 b); +extern fx_s3132 fx_s3132_div(fx_s3132 a, fx_s3132 b); +extern fx_s3132 fx_s3132_sin(fx_s3132 a); +extern fx_s3132 fx_s3132_sqrt(fx_s3132 a); +extern fx_s3132 fx_s3132_power(fx_s3132 a, fx_s3132 b); +extern fx_s3132 fx_s3132_log(fx_s3132 a); +extern fx_s3132 fx_s3132_ln(fx_s3132 a); +extern fx_s3132 fx_s3132_pi(); +extern fx_s3132 fx_s3132_pi_reverse(); int main() { int choose; @@ -26,16 +40,16 @@ int main() { scanf("%d", &a); if (a == 1) { - printf("Result: %lld\n", fx_add(num1, num2)); + printf("Result: %lld\n", fx_s3132_add(num1, num2)); } else if (a == 2) { - printf("Result: %lld\n", fx_sub(num1, num2)); + printf("Result: %lld\n", fx_s3132_sub(num1, num2)); } else if (a == 3) { - printf("Result: %lld\n", fx_mul(num1, num2)); + printf("Result: %lld\n", fx_s3132_mul(num1, num2)); } else if (a == 4) { - printf("Result: %lld\n", fx_div(num1, num2)); + printf("Result: %lld\n", fx_s3132_div(num1, num2)); } } else if (choose == 2) { @@ -49,14 +63,14 @@ int main() { fflush(stdout); scanf("%lld", &num1); - printf("Result: %lld\n", fx_sin(num1)); + printf("Result: %lld\n", fx_s3132_sin(num1)); } else if (a == 2) { printf("Input 1 fixed point number.\n"); fflush(stdout); scanf("%lld", &num1); - printf("Result: %lld\n", fx_sqrt(num1)); + printf("Result: %lld\n", fx_s3132_sqrt(num1)); } else if (a == 3) { printf("Input 2 fixed point number.\n"); @@ -64,21 +78,21 @@ int main() { scanf("%lld", &num1); scanf("%lld", &num2); - printf("Result: %lld\n", fx_power(num1, num2)); + printf("Result: %lld\n", fx_s3132_power(num1, num2)); } else if (a == 4) { printf("Input 1 fixed point number.\n"); fflush(stdout); scanf("%lld", &num1); - printf("Result: %lld\n", fx_log10(num1)); + printf("Result: %lld\n", fx_s3132_log(num1)); } else if (a == 5) { printf("Input 1 fixed point number.\n"); fflush(stdout); scanf("%lld", &num1); - printf("Result: %lld\n", fx_ln(num1)); + printf("Result: %lld\n", fx_s3132_ln(num1)); } } else if (choose == 3) { @@ -91,13 +105,13 @@ int main() { printf("Input 1 fixed point number.\n"); fflush(stdout); scanf("%lld", &num1); - printf("Result: %lf\n", fx_to_double(num1)); + printf("Result: %lf\n", fx_s3132_fx_to_double(num1)); } else if (a == 2) { printf("Input 1 double number.\n"); fflush(stdout); scanf("%lf", &dnum1); - printf("Result: %lld\n", double_to_fx(dnum1)); + printf("Result: %lld\n", fx_s3132_double_to_fx(dnum1)); } } else if (choose == 4) { @@ -107,10 +121,10 @@ int main() { scanf("%d", &a); if (a == 1) { - printf("Result: %lld\n", fx_PI()); + printf("Result: %lld\n", fx_s3132_pi()); } else if (a == 2) { - printf("Result: %lld\n", fx_PI_Reverse()); + printf("Result: %lld\n", fx_s3132_pi_reverse()); } } else if (choose == 5) {