diff --git a/fx_s4716_double.c b/fx_s4716_double.c new file mode 100644 index 0000000000000000000000000000000000000000..18857a96b446e688c1f8a8073ff946855a05342d --- /dev/null +++ b/fx_s4716_double.c @@ -0,0 +1,42 @@ +#include<stdio.h> +#include"fx_s4716_double.h" +#define _USE_MATH_DEFINES + +void fx_to_double(fx_s4716 a){ + double f2d=FX_TO_DOUBLE(a); + printf("fx to double: %.16lf\n",f2d); +} +void double_to_fx(double a){ + double d2f=DOUBLE_TO_FX(a); + printf("double to fx: %.16lf\n",d2f); +} +void fx_add(fx_s4716 a, fx_s4716 b){ + double add=FX_S4716_DOUBLE_ADD(a,b); + printf("fx add: %.16lf\n",add); +} +void fx_sub(fx_s4716 a, fx_s4716 b){ + double sub=FX_S4716_DOUBLE_SUB(a,b); + printf("fx sub : %.16lf\n",sub); +} +void fx_mul(fx_s4716 a, fx_s4716 b){ + double mul=FX_S4716_DOUBLE_MUL(a,b); + printf("fx mul : %.16lf\n",mul); +} +void fx_div(fx_s4716 a, fx_s4716 b){ + double div=FX_S4716_DOUBLE_DIV(a,b); + printf("fx div : %.16lf\n",div); +} +void fx_pi(){ + printf("pi : %.16lf\n",FX_PI); +} +void fx_inv_pi(){ + printf("inverse pi : %.16lf\n",FX_INV_PI); +} +void fx_sqrt(fx_s4716 a){ + double square=FX_S4716_DOUBLE_SQRT(a); + printf("fx sqrt : %.16lf\n",square); +} +void fx_pow(fx_s4716 a){ + double power=FX_S4716_DOUBLE_POW(a); + printf("fx pow : %.16lf\n",power); +} diff --git a/fx_s4716_double.h b/fx_s4716_double.h index d9c51653e84a4c38433e49bfd58d995e87c15fef..1198721d4d85f699ff5f632122776b827bc7357b 100644 --- a/fx_s4716_double.h +++ b/fx_s4716_double.h @@ -1,19 +1,36 @@ #include <math.h> +// #define f_POWER_2_16 65536.0 + +// #define fx_to_double(a) a/f_POWER_2_16 +// #define double_to_fx(a) (long long)(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_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(3.141592653) +// #define fx_s4716_double_sqrt(a) (sqrt(a)/(f_POWER_2_16/2)) +// #define fx_s4716_double_pow(a) (pow((double)a, 2.0)*f_POWER_2_16) + typedef long long fx_s4716; -#define f_POWER_2_16 65536.0 +#define F_POWER_2_16 65536.0 +#define F_POWER_2_8 256.0 -#define fx_to_double(a) a/f_POWER_2_16 -#define double_to_fx(a) (long long)(a*f_POWER_2_16) +#define FX_TO_DOUBLE(a) (a)/(F_POWER_2_16) +#define DOUBLE_TO_FX(a) ((a)*(F_POWER_2_16)) +//#define DOUBLE_TO_FX(a) (long long)((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_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_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(3.141592653) -#define fx_s4716_double_sqrt(a) (sqrt(a)/(f_POWER_2_16/2)) -#define fx_s4716_double_pow(a) (pow((double)a, 2.0)*f_POWER_2_16) +#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(a))/(F_POWER_2_8)) +#define FX_S4716_DOUBLE_POW(a) ((pow((double)a, 2.0))*(F_POWER_2_16)) diff --git a/fx_s4716_double.o b/fx_s4716_double.o new file mode 100644 index 0000000000000000000000000000000000000000..51177c504aa38ff4006479932c132d7f2200f5ca Binary files /dev/null and b/fx_s4716_double.o differ diff --git a/test.c b/test.c new file mode 100644 index 0000000000000000000000000000000000000000..c97a0747891e27e347576b89f71b383b4d3c2d59 --- /dev/null +++ b/test.c @@ -0,0 +1,88 @@ +#include<stdio.h> +#include "fx_s4716_double.h" + +extern void fx_to_double(fx_s4716 a); +extern void double_to_fx(double a); +extern void fx_add(fx_s4716 a, fx_s4716 b); +extern void fx_sub(fx_s4716 a, fx_s4716 b); +extern void fx_mul(fx_s4716 a, fx_s4716 b); +extern void fx_div(fx_s4716 a, fx_s4716 b); +extern void fx_pi(); +extern void fx_inv_pi(); +extern void fx_sqrt(fx_s4716 a); +extern void fx_pow(fx_s4716 a); + +int main() +{ + fx_s4716 a,b; + double c; + int option; + printf("This is program to test fixed point arithmetic\n"); + printf(" OPTION \n"); + printf("0. add \n"); + printf("1. subtract \n"); + printf("2. multiply \n"); + printf("3. divide \n"); + printf("4. square root \n"); + printf("5. power \n"); + printf("6. print PI \n"); + printf("7. print inverse PI \n"); + printf("8. fix to double \n"); + printf("9. double to fix \n"); + printf("10. quit\n\n"); + + printf("Type option : "); + fflush(stdout); + scanf("%d", &option); + switch (option) + { + case 0: + printf("Input two number : "); fflush(stdout); + scanf("%lld %lld", &a, &b); + fx_add(a, b); + break; + case 1: + printf("Input two number : "); fflush(stdout); + scanf("%lld %lld", &a, &b); + fx_sub(a, b); + break; + case 2: + printf("Input two number : "); fflush(stdout); + scanf("%lld %lld", &a, &b); + fx_mul(a, b); + break; + case 3: + printf("Input two number : "); fflush(stdout); + scanf("%lld %lld", &a, &b); + fx_div(a, b); + break; + case 4: + printf("Input one number : "); fflush(stdout); + scanf("%lld", &a); + fx_sqrt(a); + break; + case 5: + printf("Input one number : "); fflush(stdout); + scanf("%lld", &a); + fx_pow(a); + break; + case 6: + fx_pi(); + break; + case 7: + fx_inv_pi(); + break; + case 8: + printf("Input fix number : "); fflush(stdout); + scanf("%lld",&a); + fx_to_double(a); + break; + case 9: + printf("Input double number : "); fflush(stdout); + scanf("%lf",&c); + double_to_fx(c); + break; + default: + break; + } +} \ No newline at end of file diff --git a/test.o b/test.o new file mode 100644 index 0000000000000000000000000000000000000000..a2db3710d01d794756c76d0ec0572b031ae8d9e9 Binary files /dev/null and b/test.o differ