diff --git a/combination.h b/combination.h index 9899df7044e889b19e229ad65a8f5a9323e48b8c..f3daed48307f71164f5e0e069cf402d842fd55b9 100644 --- a/combination.h +++ b/combination.h @@ -21,8 +21,8 @@ #define _FX_DOUBLE 10 #define _FX_LONGLONG 11 -#define _FX_SYSTEM _FX_S2308 -#define _FX_CALCULATION_TYPE _FX_DOUBLE +#define _FX_SYSTEM _FX_S3231 +#define _FX_CALCULATION_TYPE _FX_LONGLONG #if _FX_SYSTEM == _FX_S1516 || _FX_SYSTEM == _FX_S1615 || _FX_SYSTEM == _FX_S2308 #if _FX_CALCULATION_TYPE == _FX_DOUBLE @@ -38,23 +38,14 @@ #endif #endif -#if FX_SYSTEM == _FX_S1516 - #define tmp 0 -#elif FX_SYSTEM == _FX_S1615 - #define tmp 1 -#elif FX_SYSTEM == _FX_S2308 - #define tmp 2 -#elif FX_SYSTEM == _FX_S3132 - #define tmp 3 -#elif FX_SYSTEM == _FX_S3231 - #define tmp 4 -#elif FX_SYSTEM == _FX_S4716 - #define tmp 5 -#endif - #if _FX_SYSTEM == _FX_S1516 && _FX_CALCULATION_TYPE == _FX_DOUBLE + #define fx_add(a, b) fx_s1516_double_add(a, b) + #define fx_sub(a, b) fx_s1516_double_sub(a, b) #define fx_mul(a, b) fx_s1516_double_mul(a, b) #define fx_div(a, b) fx_s1516_double_div(a, b) + #define fx_sqrt(a) fx_s1516_double_sqrt(a) + #define fx_pow(a, b) fx_s1516_double_pow(a, b) + #define fx_log(a, b) fx_s1516_double_log(a, b) #endif #if _FX_SYSTEM == _FX_S1516 && _FX_CALCULATION_TYPE == _FX_LONGLONG @@ -64,25 +55,38 @@ #define fx_div1(a, b) fx_s1516_longlong_div0(a, b) #define fx_div2(a, b) fx_s1516_longlong_div1(a, b) #define fx_div3(a, b) fx_s1516_longlong_div2(a, b) + #define fx_sin(a) fx_s1516_longlong_sin(a, b) + #define fx_sqrt(a) fx_s1516_longlong_sqrt(a, b) #endif #if _FX_SYSTEM == _FX_S1615 && _FX_CALCULATION_TYPE == _FX_DOUBLE + #define fx_add(a, b) fx_s1615_double_add(a, b) + #define fx_sub(a, b) fx_s1615_double_sub(a, b) #define fx_mul(a, b) fx_s1615_double_mul(a, b) #define fx_div(a, b) fx_s1615_double_div(a, b) + #define fx_sin(a) sine_fx_s1615_int(a) + #define fx_sqrt(a) sqrt_fx_s1615_int(a) + #define fx_pow(a, b) power_fx_s1615_int(a, b) #endif #if _FX_SYSTEM == _FX_S1615 && _FX_CALCULATION_TYPE == _FX_LONGLONG - #define fx_mul1(a, b) fx_s1516_longlong_mul1(a, b) - #define fx_mul2(a, b) fx_s1516_longlong_mul2(a, b) - #define fx_mul3(a, b) fx_s1516_longlong_mul3(a, b) - #define fx_div1(a, b) fx_s1516_longlong_div1(a, b) - #define fx_div2(a, b) fx_s1516_longlong_div2(a, b) - #define fx_div3(a, b) fx_s1516_longlong_div3(a, b) + #define fx_mul1(a, b) fx_s1615_longlong_mul1(a, b) + #define fx_mul2(a, b) fx_s1615_longlong_mul2(a, b) + #define fx_mul3(a, b) fx_s1615_longlong_mul3(a, b) + #define fx_div1(a, b) fx_s1615_longlong_div1(a, b) + #define fx_div2(a, b) fx_s1615_longlong_div2(a, b) + #define fx_div3(a, b) fx_s1615_longlong_div3(a, b) + #define fx_sin(a) sine_fx_s1615_longlong(a) #endif #if _FX_SYSTEM == _FX_S2308 && _FX_CALCULATION_TYPE == _FX_DOUBLE + #define fx_add(a, b) fx_s2308_double_add(a, b) + #define fx_sub(a, b) fx_s2308_double_sub(a, b) #define fx_mul(a, b) fx_s2308_double_mul(a, b) #define fx_div(a, b) fx_s2308_double_div(a, b) + #define fx_sin(a) fx_s2308_double_sine(a) + #define fx_sqrt(a) fx_s2308_double_sqrt(a) + #define fx_pow(a, b) fx_s2308_double_pow(a, b) #endif #if _FX_SYSTEM == _FX_S2308 && _FX_CALCULATION_TYPE == _FX_LONGLONG @@ -92,11 +96,18 @@ #define fx_mul4(a, b) fx_s2308_longlong_mul4(a, b) #define fx_div1(a, b) fx_s2308_longlong_div1(a, b) #define fx_div2(a, b) fx_s2308_longlong_div2(a, b) + #define fx_div3(a, b) a + #define fx_sin(a) fx_s2308_sind(a) #endif #if _FX_SYSTEM == _FX_S3132 && _FX_CALCULATION_TYPE == _FX_DOUBLE + #define fx_add(a, b) fx_s3132_double_add(a, b) + #define fx_sub(a, b) fx_s3132_double_sub(a, b) #define fx_mul(a, b) fx_s3132_double_mul(a, b) #define fx_div(a, b) fx_s3132_double_div(a, b) + #define fx_sin(a) fx_s3132_double_sine(a) + #define fx_sqrt(a) fx_s3132_double_sqrt(a) + #define fx_pow(a, b) fx_s3132_double_power(a, b) #endif #if _FX_SYSTEM == _FX_S3132 && _FX_CALCULATION_TYPE == _FX_LONGLONG @@ -106,11 +117,17 @@ #define fx_div1(a, b) fx_s3132_longlong_div1(a, b) #define fx_div2(a, b) fx_s3132_longlong_div2(a, b) #define fx_div3(a, b) fx_s3132_longlong_div3(a, b) + #define fx_sin(a) fx32_sind(a) #endif #if _FX_SYSTEM == _FX_S3231 && _FX_CALCULATION_TYPE == _FX_DOUBLE + #define fx_add(a, b) fx_s3231_double_add(a, b) + #define fx_sub(a, b) fx_s3231_double_sub(a, b) #define fx_mul(a, b) fx_s3231_double_mul(a, b) #define fx_div(a, b) fx_s3231_double_div(a, b) + #define fx_sin(a) fx_3231_double_sin(a) + #define fx_sqrt(a) fx_3231_double_sqrt(a) + #define fx_pow(a, b) fx_3231_double_power(a, b) #endif #if _FX_SYSTEM == _FX_S3231 && _FX_CALCULATION_TYPE == _FX_LONGLONG @@ -120,11 +137,17 @@ #define fx_div1(a, b) fx_s3231_longlong_div1(a, b) #define fx_div2(a, b) fx_s3231_longlong_div2(a, b) #define fx_div3(a, b) fx_s3231_longlong_div3(a, b) + #define fx_sin(a) fx_3231_longlong_sin(a) #endif #if _FX_SYSTEM == _FX_S4716 && _FX_CALCULATION_TYPE == _FX_DOUBLE + #define fx_add(a, b) fx_s4716_double_add(a, b) + #define fx_sub(a, b) fx_s4716_double_sub(a, b) #define fx_mul(a, b) fx_s4716_double_mul(a, b) #define fx_div(a, b) fx_s4716_double_div(a, b) + #define fx_sqrt(a) fx_s4716_double_sqrt(a) + #define fx_pow(a) fx_s4716_double_pow(a) + #define fx_sin(a) fx_s4716_double_sin(a) #endif #if _FX_SYSTEM == _FX_S4716 && _FX_CALCULATION_TYPE == _FX_LONGLONG @@ -134,4 +157,9 @@ #define fx_div1(a, b) fx_s4716_longlong_div1(a, b) #define fx_div2(a, b) fx_s4716_longlong_div2(a, b) #define fx_div3(a, b) fx_s4716_longlong_div3(a, b) -#endif \ No newline at end of file + #define fx_sin(a) a +#endif + +// #define fx_log(a, b) a +// #define fx_sin(a) a +// #define fx_sqrt(a, b) a \ No newline at end of file diff --git a/fx_s1516_double.c b/fx_s1516_double.c index f3bccb86b1ebfe03c2ed4b2fcd595060d15958a0..6168c7a2161dd7e13c7e00281724436a494f95d5 100644 --- a/fx_s1516_double.c +++ b/fx_s1516_double.c @@ -1,12 +1,12 @@ // fx_s1516_double.c file #include "fx_s1516_double.h" -fx_s1516 double_to_fx(double a) +fx_s1516 double_to_fx_s1516(double a) { return (int)(((a)*P2_16)); } -double fx_to_double(fx_s1516 a) +double fx_s1516_to_double(fx_s1516 a) { return ((double)(a) / P2_16); } diff --git a/fx_s1516_double.h b/fx_s1516_double.h index 35fcf6da524e3748afbb4a3492067f85d5198d54..48930327429eecbaf442f91307de2058e170eaa4 100644 --- a/fx_s1516_double.h +++ b/fx_s1516_double.h @@ -11,8 +11,8 @@ typedef int fx_s1516; #define fx_s1516_PI M_PI #define fx_s1516_INVERSE_PI 1 / M_PI -extern fx_s1516 double_to_fx(double a); -extern double fx_to_double(fx_s1516 a); +extern fx_s1516 double_to_fx_s1516(double a); +extern double fx_s1516_to_double(fx_s1516 a); extern double baselog(double a, double base); extern double fx_s1516_double_add(double a, double b); extern double fx_s1516_double_sub(double a, double b); diff --git a/fx_s1516_longlong.c b/fx_s1516_longlong.c index b002fd00ec3e0def798c95a07e14dbb8db900835..bf02882fa9e7547a08ab5ec3ba9d9e80850315c4 100644 --- a/fx_s1516_longlong.c +++ b/fx_s1516_longlong.c @@ -6,7 +6,7 @@ #define FX32_360 0x01680000 // sin table -const fixed32 fx32_SinTable[92] = +const fixed32 fx32_SinTable1[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, @@ -58,12 +58,12 @@ int sqrt_lut[1025] = 0x1F563DB7, 0x1F5A531E, 0x1F5E67FD, 0x1F627C54, 0x1F669024, 0x1F6AA36C, 0x1F6EB62D, 0x1F72C866, 0x1F76DA19, 0x1F7AEB45, 0x1F7EFBEB, 0x1F830C0B, 0x1F871BA4, 0x1F8B2AB8, 0x1F8F3946, 0x1F93474E, 0x1F9754D1, 0x1F9B61D0, 0x1F9F6E49, 0x1FA37A3E, 0x1FA785AE, 0x1FAB909A, 0x1FAF9B02, 0x1FB3A4E7, 0x1FB7AE47, 0x1FBBB724, 0x1FBFBF7E, 0x1FC3C755, 0x1FC7CEA9, 0x1FCBD57A, 0x1FCFDBC9, 0x1FD3E196, 0x1FD7E6E0, 0x1FDBEBA9, 0x1FDFEFEF, 0x1FE3F3B5, 0x1FE7F6F9, 0x1FEBF9BC, 0x1FEFFBFD, 0x1FF3FDBF, 0x1FF7FEFF, 0x1FFBFFBF, 0x20000000}; -fx_s1516 longlong_to_fx(long long a) +fx_s1516 longlong_to_fx_s1516(long long a) { return (int)(((a)*fP2_16)); } -long long fx_to_longlong(fx_s1516 a) +long long fx_s1516_to_longlong(fx_s1516 a) { return (a / 65536); } @@ -155,8 +155,8 @@ fx_s1516 fx_s1516_longlong_sin(fx_s1516 fa) if (fa > FX32_90) fa = FX32_180 - fa; idx = fa >> 16; - ret0 = fx32_SinTable[idx]; - diff = fx32_SinTable[idx + 1] - ret0; + ret0 = fx32_SinTable1[idx]; + diff = fx32_SinTable1[idx + 1] - ret0; return (fixed32)(sign * (ret0 + ((diff * (fa & 0xFFFF)) >> 16))); } diff --git a/fx_s1516_longlong.h b/fx_s1516_longlong.h index 510a3549c4e1c142c7bbed1c9f845d84969a47f5..df2dd1ae1b58b29273e5bb904e6868c05984ebed 100644 --- a/fx_s1516_longlong.h +++ b/fx_s1516_longlong.h @@ -10,8 +10,8 @@ typedef int fx_s1516; typedef long fixed32; typedef long long fixed64; -extern fx_s1516 longlong_to_fx(long long a); -extern long long fx_to_longlong(fx_s1516 a); +extern fx_s1516 longlong_to_fx_s1516(long long a); +extern long long fx_s1516_to_longlong(fx_s1516 a); extern fx_s1516 fx_s1516_longlong_mul0(fx_s1516 a, fx_s1516 b); extern fx_s1516 fx_s1516_longlong_mul1(fx_s1516 a, fx_s1516 b); extern fx_s1516 fx_s1516_longlong_mul2(fx_s1516 a, fx_s1516 b); diff --git a/fx_s1615_double.h b/fx_s1615_double.h index 15df94713b7c16405011e4e2fed1d20e36788f62..efff79baa6a135128022059607e73a39f33ffee4 100644 --- a/fx_s1615_double.h +++ b/fx_s1615_double.h @@ -7,8 +7,8 @@ typedef int fx_s1615; #define FX_S1615_INT_TO_DOUBLE(a) ((a) / P2_15) // right shift #define FX_S1615_DOUBLE_TO_INT(a) (int)((a)*P2_15) // left shift -#define FX_S1615_ADD(a, b) ((a) + (b)) -#define FX_S1615_SUB(a, b) ((a) - (b)) +#define fx_s1615_double_add(a, b) ((a) + (b)) +#define fx_s1615_double_sub(a, b) ((a) - (b)) #define fx_s1615_double_mul(a, b) FX_S1615_DOUBLE_TO_INT(FX_S1615_INT_TO_DOUBLE(a) * FX_S1615_INT_TO_DOUBLE(b)) #define fx_s1615_double_div(a, b) FX_S1615_DOUBLE_TO_INT(FX_S1615_INT_TO_DOUBLE(a) / FX_S1615_INT_TO_DOUBLE(b)) diff --git a/fx_s1615_longlong.h b/fx_s1615_longlong.h index bfccea149bfdff2a9a0f8dcf41c8dcf25bc24ec9..69f0fbee748e33690195d56d191ab04124589d37 100644 --- a/fx_s1615_longlong.h +++ b/fx_s1615_longlong.h @@ -5,12 +5,12 @@ typedef int fx_s1615; typedef long long fixed64; -#define fx_s1516_longlong_mul1(a, b) (fx_s1615)(((fixed64)(a) * (b)) >> 15) -#define fx_s1516_longlong_mul2(a, b) ((a) * (b)) >> 15 -#define fx_s1516_longlong_mul3(a, b) ((a >> 8) * (b >> 7)) -#define fx_s1516_longlong_div1(a, b) (fx_s1615)((fixed64)((a >> 15) / (b >> 15)) << 15) -#define fx_s1516_longlong_div2(a, b) (((a << 5) / (b >> 6)) << 4) -#define fx_s1516_longlong_div3(a, b) (fx_s1615)(((fixed64)(a) << 15) / (b)) +#define fx_s1615_longlong_mul1(a, b) (fx_s1615)(((fixed64)(a) * (b)) >> 15) +#define fx_s1615_longlong_mul2(a, b) ((a) * (b)) >> 15 +#define fx_s1615_longlong_mul3(a, b) ((a >> 8) * (b >> 7)) +#define fx_s1615_longlong_div1(a, b) (fx_s1615)((fixed64)((a >> 15) / (b >> 15)) << 15) +#define fx_s1615_longlong_div2(a, b) (((a << 5) / (b >> 6)) << 4) +#define fx_s1615_longlong_div3(a, b) (fx_s1615)(((fixed64)(a) << 15) / (b)) extern fx_s1615 sine_fx_s1615_longlong(fx_s1615 angle); diff --git a/fx_s2308_double.h b/fx_s2308_double.h index cc35cf55936d2994e3e717717cfbd112d5f33f6e..ea3b44a8e1541c433b0d01f994786b515f75dad0 100644 --- a/fx_s2308_double.h +++ b/fx_s2308_double.h @@ -5,8 +5,8 @@ typedef int fx_s2308; #define FX_TO_INT(a) ((int)(a / (256.0))) #define FX_TO_SHORT(a) ((short)(a / (256.0))) #define DOUBLE_TO_FX(a) (((int)(a * (256.0)))) -#define FX_ADD(a, b) ((a) + (b)) -#define FX_SUB(a, b) ((a) - (b)) +#define fx_s2308_double_add(a, b) ((a) + (b)) +#define fx_s2308_double_sub(a, b) ((a) - (b)) #define fx_s2308_double_mul(a, b) DOUBLE_TO_FX(FX_TO_DOUBLE(a) * FX_TO_DOUBLE(b)) #define fx_s2308_double_div(a, b) DOUBLE_TO_FX(FX_TO_DOUBLE(a) / FX_TO_DOUBLE(b)) #define PI 3.141592 diff --git a/fx_s3132_double.h b/fx_s3132_double.h index e47bca0655d4fab1e0d227345b87d977e1f3f8c8..a3a8a1e74bfb0bcbaf092c5ed9f7137b2dfedb9b 100644 --- a/fx_s3132_double.h +++ b/fx_s3132_double.h @@ -4,14 +4,14 @@ #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_s3132_double_add(a, b) ((a) + (b)) +#define fx_s3132_double_sub(a, b) ((a) - (b)) #define fx_s3132_double_mul(a, b) double_to_fx(fx_to_double(a) * fx_to_double(b)) -#define fx_s3132_double_div(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_s3132_double_div1(a, b) (double)a *(double)b / P2_2to32 +#define fx_s3132_double_div(a, b) double_to_fx(fx_to_double(a) / fx_to_double(b)) +#define fx_s3132_double_sine(a) double_to_fx(sin(fx_to_double(a))) +#define fx_s3132_double_sqrt(a) double_to_fx(sqrt(fx_to_double(a))) +#define fx_s3132_double_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)) diff --git a/fx_s3231_double.h b/fx_s3231_double.h index f99b327906657ab2d62a78c7c34333688318918a..ac071a2f3b495689f8d07c5a97ca231f88377a9e 100644 --- a/fx_s3231_double.h +++ b/fx_s3231_double.h @@ -10,6 +10,6 @@ typedef long long fx_s3231; #define fx_3231_double_mul(a, b) (doubleToFx(fxToDouble(a) * fxToDouble(b))) #define fx_3231_double_div(a, b) (doubleToFx(fxToDouble(a) / fxToDouble(b))) -extern long long fx_3231_double_sin(); -extern long long fx_3231_double_sqrt(); -extern long long fx_3231_double_power(); +extern long long fx_3231_double_sin(fx_s3231 a); +extern long long fx_3231_double_sqrt(fx_s3231 a); +extern long long fx_3231_double_power(fx_s3231 a, fx_s3231 b); diff --git a/fx_s3231_longlong.h b/fx_s3231_longlong.h index f9cc9950ffa53cca6b34746717d4ddf826bb8a85..435528ae13f248ba91f442f123704134ea2ec300 100644 --- a/fx_s3231_longlong.h +++ b/fx_s3231_longlong.h @@ -1,9 +1,9 @@ -#define fx_3231_longlong_mul1(a, b) (((a) * (b)) >> 31) -#define fx_3231_longlong_mul2(a, b) (((a >> 8) * (b >> 8)) >> 15) -#define fx_3231_longlong_mul3(a, b) ((a >> 16) * (b >> 15)) +#define fx_s3231_longlong_mul1(a, b) (((a) * (b)) >> 31) +#define fx_s3231_longlong_mul2(a, b) (((a >> 8) * (b >> 8)) >> 15) +#define fx_s3231_longlong_mul3(a, b) ((a >> 16) * (b >> 15)) -#define fx_3231_longlong_div1(a, b) (((a << 8) / (b >> 8)) << 15) -#define fx_3231_longlong_div2(a, b) (((a << 10) / (b >> 10)) << 11) -#define fx_3231_longlong_div3(a, b) ((a << 16) / (b >> 15)) +#define fx_s3231_longlong_div1(a, b) (((a << 8) / (b >> 8)) << 15) +#define fx_s3231_longlong_div2(a, b) (((a << 10) / (b >> 10)) << 11) +#define fx_s3231_longlong_div3(a, b) ((a << 16) / (b >> 15)) -extern long long fx_3231_longlong_sin(); +extern long long fx_3231_longlong_sin(fx_s3231 a); diff --git a/fx_s4716_double.c b/fx_s4716_double.c index b6c5df50031d8ab33fa04c490b9224ab37c2daed..2488770c06b6f33279bad63a92c064f55a769b5f 100644 --- a/fx_s4716_double.c +++ b/fx_s4716_double.c @@ -10,16 +10,16 @@ fx_s4716 double_to_fx(double a) fx_s4716 d2f = DOUBLE_TO_FX(a); return d2f; } -double fx_add(double a, double b) -{ - fx_s4716 add = double_to_fx(FX_S4716_DOUBLE_ADD(a, b)); - return fx_to_double(add); -} -double fx_sub(double a, double b) -{ - fx_s4716 sub = double_to_fx(FX_S4716_DOUBLE_SUB(a, b)); - return fx_to_double(sub); -} +// double fx_add(double a, double b) +// { +// fx_s4716 add = double_to_fx(FX_S4716_DOUBLE_ADD(a, b)); +// return fx_to_double(add); +// } +// double fx_sub(double a, double b) +// { +// fx_s4716 sub = double_to_fx(FX_S4716_DOUBLE_SUB(a, b)); +// return fx_to_double(sub); +// } // double fx_s4716_double_mul(double a, double b) // { // double mul = FX_S4716_DOUBLE_MUL(a, b); @@ -38,18 +38,18 @@ double fx_inv_pi() { return fx_to_double(FX_INV_PI); } -double fx_sqrt(double a) -{ - double square = FX_S4716_DOUBLE_SQRT(a); - return square; -} -double fx_pow(double a) -{ - double power = fx_to_double(FX_S4716_DOUBLE_POW(a)); - return power; -} -double fx_sine(fx_s4716 a) -{ - double sine = double_to_fx(FX_S4716_DOUBLE_SINE(a)); - return fx_to_double(sine); -} +// double fx_sqrt(double a) +// { +// double square = FX_S4716_DOUBLE_SQRT(a); +// return square; +// } +// double fx_pow(double a) +// { +// double power = fx_to_double(FX_S4716_DOUBLE_POW(a)); +// return power; +// } +// double fx_sine(fx_s4716 a) +// { +// double sine = double_to_fx(FX_S4716_DOUBLE_SINE(a)); +// return fx_to_double(sine); +// } diff --git a/fx_s4716_double.h b/fx_s4716_double.h index 623d83995b6358d58120e552ff9f28c18d140ab9..e4560febd933adb6a0c131035446ea416012d0ba 100644 --- a/fx_s4716_double.h +++ b/fx_s4716_double.h @@ -10,13 +10,13 @@ typedef long long fx_s4716; #define FX_TO_DOUBLE(a) (a) / (F_POWER_2_16) #define DOUBLE_TO_FX(a) ((a) * (F_POWER_2_16)) -#define FX_S4716_DOUBLE_ADD(a, b) ((a) + (b)) -#define FX_S4716_DOUBLE_SUB(a, b) ((a) - (b)) +#define fx_s4716_double_add(a, b) ((a) + (b)) +#define fx_s4716_double_sub(a, b) ((a) - (b)) #define fx_s4716_double_mul(a, b) (DOUBLE_TO_FX((FX_TO_DOUBLE(a)) * (FX_TO_DOUBLE(b)))) #define fx_s4716_double_div(a, b) (DOUBLE_TO_FX((FX_TO_DOUBLE(a)) / (FX_TO_DOUBLE(b)))) #define FX_PI (DOUBLE_TO_FX(M_PI)) #define FX_INV_PI (DOUBLE_TO_FX(1 / (M_PI))) -#define FX_S4716_DOUBLE_SQRT(a) ((sqrt(DOUBLE_TO_FX(a))) / (F_POWER_2_8)) -#define FX_S4716_DOUBLE_POW(a) ((pow(DOUBLE_TO_FX(a), 2.0)) / (F_POWER_2_16)) -#define FX_S4716_DOUBLE_SINE(a) (sin(a)) +#define fx_s4716_double_sqrt(a) ((sqrt(DOUBLE_TO_FX(a))) / (F_POWER_2_8)) +#define fx_s4716_double_pow(a) ((pow(DOUBLE_TO_FX(a), 2.0)) / (F_POWER_2_16)) +#define fx_s4716_double_sin(a) (sin(a)) diff --git a/fx_s4716_longlong.h b/fx_s4716_longlong.h index eb73976a6cec559e55a1db262db3828aa443e728..0e7bacd91a8f1021897f019d660444325aee3e91 100644 --- a/fx_s4716_longlong.h +++ b/fx_s4716_longlong.h @@ -1,10 +1,10 @@ typedef long long fx_s4716; #include <math.h> -#define fx_s4716_longlong_mul1(a, b)(a, b) (((a) * (b)) >> 16) -#define fx_s4716_longlong_mul2(a, b)(a, b) ((a >> 8) * (b >> 8)) -#define fx_s4716_longlong_mul3(a, b)(a, b) (((a >> 4) * (b >> 4)) >> 8) +#define fx_s4716_longlong_mul1(a, b) (((a) * (b)) >> 16) +#define fx_s4716_longlong_mul2(a, b) ((a >> 8) * (b >> 8)) +#define fx_s4716_longlong_mul3(a, b) (((a >> 4) * (b >> 4)) >> 8) -#define fx_s4716_longlong_div1(a, b)(a, b) ((a << 16) / (b)) +#define fx_s4716_longlong_div1(a, b) ((a << 16) / (b)) #define fx_s4716_longlong_div2(a, b) (((a << 8) / (b)) << 8) #define fx_s4716_longlong_div3(a, b) (((a << 12) / (b)) << 4) diff --git a/test.c b/test.c index ab4bc8a30b123c6d2efe972e954975df0cea0cbf..a523610f0fca2cb304a8d40dac8f6b69396ea56e 100644 --- a/test.c +++ b/test.c @@ -1,12 +1,122 @@ #include <stdio.h> #include "combination.h" +int tmp; + +#if _FX_SYSTEM == 1 + tmp = 0; +#elif _FX_SYSTEM == 2 + tmp = 1; +#elif _FX_SYSTEM == 3 + tmp = 2; +#elif _FX_SYSTEM == 4 + tmp = 3; +#elif _FX_SYSTEM == 5 + tmp = 4; +#elif _FX_SYSTEM == 6 + tmp = 5; +#endif + int main(){ int a; + char* str; + + if(tmp==0) str = "fx_1516"; + else if(tmp==1) str = "fx_1615"; + else if(tmp==2) str = "fx_2308"; + else if(tmp==3) str = "fx_3132"; + else if(tmp==4) str = "fx_3231"; + else if(tmp==5) str = "fx_4716"; + + printf("\n=====%s fixed point=====\n", str); + + if(fx_type == 0 && tmp == 0){ + printf("1.Add 2.Sub 3.Mul 4.Div 5.Sqrt 6.Power 7.Log\n"); + fflush(stdout); + scanf("%d", &a); + + int num1, num2; + + printf("Input 2 numbers : \n"); + fflush(stdout); + scanf("%d", &num1); + scanf("%d", &num2); + + if(a==1){ + printf("\n=====Result=====\n"); + printf("Add: %d\n", fx_add(num1, num2)); + } + if(a==2){ + printf("\n=====Result=====\n"); + printf("Sub: %d\n", fx_sub(num1, num2)); + } + if(a==3){ + printf("\n=====Result=====\n"); + printf("Mul: %d\n", fx_mul(num1, num2)); + } + if(a==4){ + printf("\n=====Result=====\n"); + printf("Div: %d\n", fx_div(num1, num2)); + } + if(a==5){ + printf("\n=====Result=====\n"); + printf("Sqrt: %d\n", fx_sqrt(num1)); + } + if(a==6){ + printf("\n=====Result=====\n"); + printf("Pow: %d\n", fx_pow(num1, num2)); + } + // if(a==7){ + // printf("\n=====Result=====\n"); + // printf("Log: %d\n", fx_log(num1, num2)); + // } + } + + else if(fx_type == 0 && tmp == 1){ + printf("1.Add 2.Sub 3.Mul 4.Div 5.Sin 6.Sqrt 7.Power\n"); + fflush(stdout); + scanf("%d", &a); + + int num1, num2; + + printf("Input 2 numbers : \n"); + fflush(stdout); + scanf("%d", &num1); + scanf("%d", &num2); + + if(a==1){ + printf("\n=====Result=====\n"); + printf("Add: %d\n", fx_add(num1, num2)); + } + if(a==2){ + printf("\n=====Result=====\n"); + printf("Sub: %d\n", fx_sub(num1, num2)); + } + if(a==3){ + printf("\n=====Result=====\n"); + printf("Mul: %d\n", fx_mul(num1, num2)); + } + if(a==4){ + printf("\n=====Result=====\n"); + printf("Div: %d\n", fx_div(num1, num2)); + } + if(a==5){ + printf("\n=====Result=====\n"); + printf("Sin: %d\n", fx_sin(num1)); + } + if(a==6){ + printf("\n=====Result=====\n"); + printf("Sqrt: %d\n", fx_sqrt(num1)); + } + if(a==7){ + printf("\n=====Result=====\n"); + printf("Pow: %d\n", fx_pow(num1, num2)); + } + } - if(fx_type == 0){ - printf("1. Mul 2.Div\n"); + else if(fx_type == 0 && tmp == 2){ + printf("1.Add 2.Sub 3.Mul 4.Div 5.Sin 6.Sqrt 7.Power\n"); fflush(stdout); scanf("%d", &a); @@ -19,16 +129,36 @@ int main(){ if(a==1){ printf("\n=====Result=====\n"); - printf("Result: %d\n", fx_mul(num1, num2)); + printf("Add: %d\n", fx_add(num1, num2)); } if(a==2){ printf("\n=====Result=====\n"); - printf("Result: %d\n", fx_div(num1, num2)); + printf("Sub: %d\n", fx_sub(num1, num2)); + } + if(a==3){ + printf("\n=====Result=====\n"); + printf("Mul: %d\n", fx_mul(num1, num2)); + } + if(a==4){ + printf("\n=====Result=====\n"); + printf("Div: %d\n", fx_div(num1, num2)); + } + if(a==5){ + printf("\n=====Result=====\n"); + printf("Sin: %d\n", fx_sin(num1)); + } + if(a==6){ + printf("\n=====Result=====\n"); + printf("Sqrt: %d\n", fx_sqrt(num1)); + } + if(a==7){ + printf("\n=====Result=====\n"); + printf("Pow: %d\n", fx_pow(num1, num2)); } } - else if(fx_type == 1){ - printf("1. Mul 2.Div\n"); + else if(fx_type == 1 && tmp == 0){ + printf("1. Mul 2.Div 3.Sin 4.Sqrt\n"); fflush(stdout); scanf("%d", &a); @@ -45,16 +175,84 @@ int main(){ printf("MUL2: %d\n", fx_mul2(num1, num2)); printf("MUL3: %d\n", fx_mul3(num1, num2)); } - if(a==2){ + else if(a==2){ + printf("\n=====Result=====\n"); + printf("Div1: %d\n", fx_div1(num1, num2)); + printf("Div2: %d\n", fx_div2(num1, num2)); + printf("Div3: %d\n", fx_div3(num1, num2)); + } + else if(a==3){ + printf("\n=====Result=====\n"); + printf("Sin: %d\n", fx_sin(num1)); + } + // else if(a==4){ + // printf("\n=====Result=====\n"); + // printf("Sqrt: %d\n", fx_sqrt(num1)); + // } + } + + else if(fx_type == 1 && tmp == 1){ + printf("1. Mul 2.Div 3.Sin\n"); + fflush(stdout); + scanf("%d", &a); + + int num1, num2; + + printf("Input 2 numbers : \n"); + fflush(stdout); + scanf("%d", &num1); + scanf("%d", &num2); + + if(a==1){ printf("\n=====Result=====\n"); printf("MUL1: %d\n", fx_mul1(num1, num2)); printf("MUL2: %d\n", fx_mul2(num1, num2)); printf("MUL3: %d\n", fx_mul3(num1, num2)); } + else if(a==2){ + printf("\n=====Result=====\n"); + printf("Div1: %d\n", fx_div1(num1, num2)); + printf("Div2: %d\n", fx_div2(num1, num2)); + printf("Div3: %d\n", fx_div3(num1, num2)); + } + else if(a==3){ + printf("\n=====Result=====\n"); + printf("Sin: %d\n", fx_sin(num1)); + } } - if(fx_type == 2){ - printf("1. Mul 2.Div\n"); + else if(fx_type == 1 && tmp == 2){ + printf("1. Mul 2.Div 3.Sin 4.Sqrt\n"); + fflush(stdout); + scanf("%d", &a); + + int num1, num2; + + printf("Input 2 numbers : \n"); + fflush(stdout); + scanf("%d", &num1); + scanf("%d", &num2); + + if(a==1){ + printf("\n=====Result=====\n"); + printf("MUL1: %d\n", fx_mul1(num1, num2)); + printf("MUL2: %d\n", fx_mul2(num1, num2)); + printf("MUL3: %d\n", fx_mul3(num1, num2)); + //printf("MUL4: %d\n", fx_mul4(num1, num2)); + } + else if(a==2){ + printf("\n=====Result=====\n"); + printf("Div1: %d\n", fx_div1(num1, num2)); + printf("Div2: %d\n", fx_div2(num1, num2)); + } + else if(a==3){ + printf("\n=====Result=====\n"); + printf("Sin: %d\n", fx_sin(num1)); + } + } + + else if(fx_type == 2 && tmp == 3){ + printf("1.Add 2.Sub 3.Mul 4.Div 5.Sin 6.Sqrt 7.Power\n"); fflush(stdout); scanf("%d", &a); @@ -62,21 +260,83 @@ int main(){ printf("Input 2 numbers : \n"); fflush(stdout); - scanf("%ld", &num1); - scanf("%ld", &num2); + scanf("%d", &num1); + scanf("%d", &num2); if(a==1){ printf("\n=====Result=====\n"); - printf("Result: %ld\n", fx_mul(num1, num2)); + printf("Add: %lld\n", fx_add(num1, num2)); } if(a==2){ printf("\n=====Result=====\n"); - printf("Result: %ld\n", fx_div(num1, num2)); + printf("Sub: %lld\n", fx_sub(num1, num2)); + } + if(a==3){ + printf("\n=====Result=====\n"); + printf("Mul: %lld\n", fx_mul(num1, num2)); + } + if(a==4){ + printf("\n=====Result=====\n"); + printf("Div: %lld\n", fx_div(num1, num2)); + } + if(a==5){ + printf("\n=====Result=====\n"); + printf("Sin: %lld\n", fx_sin(num1)); + } + if(a==6){ + printf("\n=====Result=====\n"); + printf("Sqrt: %lld\n", fx_sqrt(num1)); + } + if(a==7){ + printf("\n=====Result=====\n"); + printf("Pow: %lld\n", fx_pow(num1, num2)); } } - else if(fx_type==3){ - printf("1. Mul 2.Div\n"); + else if(fx_type == 2 && tmp == 4){ + printf("1.Add 2.Sub 3.Mul 4.Div 5.Sin 6.Sqrt 7.Power\n"); + fflush(stdout); + scanf("%d", &a); + + long long num1, num2; + + printf("Input 2 numbers : \n"); + fflush(stdout); + scanf("%d", &num1); + scanf("%d", &num2); + + if(a==1){ + printf("\n=====Result=====\n"); + printf("Add: %lld\n", fx_add(num1, num2)); + } + if(a==2){ + printf("\n=====Result=====\n"); + printf("Sub: %lld\n", fx_sub(num1, num2)); + } + if(a==3){ + printf("\n=====Result=====\n"); + printf("Mul: %lld\n", fx_mul(num1, num2)); + } + if(a==4){ + printf("\n=====Result=====\n"); + printf("Div: %lld\n", fx_div(num1, num2)); + } + if(a==5){ + printf("\n=====Result=====\n"); + printf("Sin: %lld\n", fx_sin(num1)); + } + if(a==6){ + printf("\n=====Result=====\n"); + printf("Sqrt: %lld\n", fx_sqrt(num1)); + } + if(a==7){ + printf("\n=====Result=====\n"); + printf("Pow: %lld\n", fx_pow(num1, num2)); + } + } + + else if(fx_type == 2 && tmp == 5){ + printf("1.Add 2.Sub 3.Mul 4.Div 5.Sqrt 6.Power 7.Sin\n"); fflush(stdout); scanf("%d", &a); @@ -84,20 +344,122 @@ int main(){ printf("Input 2 numbers : \n"); fflush(stdout); - scanf("%ld", &num1); - scanf("%ld", &num2); + scanf("%lld", &num1); + scanf("%lld", &num2); if(a==1){ printf("\n=====Result=====\n"); - printf("MUL1: %ld\n", fx_mul1(num1, num2)); - printf("MUL2: %ld\n", fx_mul2(num1, num2)); - printf("MUL3: %ld\n", fx_mul3(num1, num2)); + printf("Add: %lld\n", fx_add(num1, num2)); } if(a==2){ printf("\n=====Result=====\n"); - printf("MUL1: %ld\n", fx_mul1(num1, num2)); - printf("MUL2: %ld\n", fx_mul2(num1, num2)); - printf("MUL3: %ld\n", fx_mul3(num1, num2)); + printf("Sub: %lld\n", fx_sub(num1, num2)); + } + if(a==3){ + printf("\n=====Result=====\n"); + printf("Mul: %lld\n", fx_mul(num1, num2)); + } + if(a==4){ + printf("\n=====Result=====\n"); + printf("Div: %lld\n", fx_div(num1, num2)); + } + if(a==5){ + printf("\n=====Result=====\n"); + printf("Sqrt: %lld\n", fx_sqrt(num1)); + } + if(a==6){ + printf("\n=====Result=====\n"); + printf("Pow: %lld\n", fx_pow(num1, num2)); + } + if(a==7){ + printf("\n=====Result=====\n"); + printf("Sin: %lld\n", fx_sin(num1)); + } + } + + else if(fx_type == 3 && tmp == 3){ + printf("1. Mul 2.Div 3.Sin\n"); + fflush(stdout); + scanf("%d", &a); + + long long num1, num2; + + printf("Input 2 numbers : \n"); + fflush(stdout); + scanf("%lld", &num1); + scanf("%lld", &num2); + + if(a==1){ + printf("\n=====Result=====\n"); + printf("MUL1: %lld\n", fx_mul1(num1, num2)); + printf("MUL2: %lld\n", fx_mul2(num1, num2)); + printf("MUL3: %lld\n", fx_mul3(num1, num2)); + } + else if(a==2){ + printf("\n=====Result=====\n"); + printf("Div1: %lld\n", fx_div1(num1, num2)); + printf("Div2: %lld\n", fx_div2(num1, num2)); + printf("Div3: %lld\n", fx_div3(num1, num2)); + } + else if(a==3){ + printf("\n=====Result=====\n"); + printf("Sin: %lld\n", fx_sin(num1)); + } + } + + else if(fx_type == 3 && tmp == 4){ + printf("1. Mul 2.Div 3.Sin\n"); + fflush(stdout); + scanf("%d", &a); + + long long num1, num2; + + printf("Input 2 numbers : \n"); + fflush(stdout); + scanf("%lld", &num1); + scanf("%lld", &num2); + + if(a==1){ + printf("\n=====Result=====\n"); + printf("MUL1: %lld\n", fx_mul1(num1, num2)); + printf("MUL2: %lld\n", fx_mul2(num1, num2)); + printf("MUL3: %lld\n", fx_mul3(num1, num2)); + } + else if(a==2){ + printf("\n=====Result=====\n"); + printf("Div1: %lld\n", fx_div1(num1, num2)); + printf("Div2: %lld\n", fx_div2(num1, num2)); + printf("Div3: %lld\n", fx_div3(num1, num2)); + } + else if(a==3){ + printf("\n=====Result=====\n"); + printf("Sin: %lld\n", fx_sin(num1)); + } + } + + else if(fx_type == 3 && tmp == 5){ + printf("1. Mul 2.Div\n"); + fflush(stdout); + scanf("%d", &a); + + long long num1, num2; + + printf("Input 2 numbers : \n"); + fflush(stdout); + scanf("%lld", &num1); + scanf("%lld", &num2); + + if(a==1){ + printf("\n=====Result=====\n"); + printf("MUL1: %lld\n", fx_mul1(num1, num2)); + printf("MUL2: %lld\n", fx_mul2(num1, num2)); + printf("MUL3: %lld\n", fx_mul3(num1, num2)); + } + else if(a==2){ + printf("\n=====Result=====\n"); + printf("Div1: %lld\n", fx_div1(num1, num2)); + printf("Div2: %lld\n", fx_div2(num1, num2)); + printf("Div3: %lld\n", fx_div3(num1, num2)); } } } \ No newline at end of file