diff --git a/lec12/fx_s17_14.c b/lec12/fx_s17_14.c new file mode 100644 index 0000000000000000000000000000000000000000..b8e3b4bce3a4df011b3ef98f7f0fc7bb2d5fd706 --- /dev/null +++ b/lec12/fx_s17_14.c @@ -0,0 +1,100 @@ +#include "fx_head.h" +#include "fx_s17_14.h" + +#define fxADD(a,b) ((a)+(b)) +#define FX_Q_NUM_H (FX_Q_NUM/2) +#define FX_Q_NUM_HA (FX_Q_NUM_H-FX_Q_NUM_H/2) +#define FX_Q_NUM_HB (FX_Q_NUM_H/2) +/* +extern fixed fxAdd_float(), fxAdd_precision(), fxAdd_fair(), fxAdd_performance(); +extern fixed fxSub_float(), fxSub_precision(), fxSub_fair(), fxSub_performance(); +extern fixed fxMul_float(), fxMul_precision(), fxMul_fair(), fxMul_performance(); +extern fixed fxDiv_float(), fxDiv_precision(), fxDiv_fair(), fxDiv_performance(); +*/ + +// float function +fixed fxAdd_float(fixed a, fixed b) +{ + return fromFloat(toFloat(a) + toFloat(b)); +} + +fixed fxSub_float(fixed a, fixed b) +{ + return fromFloat(toFloat(a) - toFloat(b)); +} + +fixed fxMul_float(fixed a, fixed b) +{ + return fromFloat(toFloat(a) * toFloat(b)); +} + +fixed fxDiv_float(fixed a, fixed b) +{ + return fromFloat(toFloat(a) / toFloat(b)); +} + +// precision function +fixed fxAdd_precision(fixed a, fixed b) +{ + return fromFloat(toFloat(a) + toFloat(b)); +} + +fixed fxSub_precision(fixed a, fixed b) +{ + return fromFloat(toFloat(a) - toFloat(b)); +} + +fixed fxMul_precision(fixed a, fixed b) +{ + long long la=a, lb=b, lc; + lc = la*lb; //오버플로우가 발생하지 않는다는 장점 + lc >>= FX_Q_NUM; + return (fixed) lc; +} + +fixed fxDiv_precision(fixed a, fixed b) +{ + return fromFloat(toFloat(a) / toFloat(b)); +} + +// fair function +fixed fxAdd_fair(fixed a, fixed b) +{ + return fromFloat(toFloat(a) + toFloat(b)); +} + +fixed fxSub_fair(fixed a, fixed b) +{ + return fromFloat(toFloat(a) - toFloat(b)); +} + +fixed fxMul_fair(fixed a, fixed b) +{ + return ((a>>FX_Q_NUM_HA)*(b>>FX_Q_NUM_HB))>>FX_Q_NUM_H; +} + +fixed fxDiv_fair(fixed a, fixed b) +{ + return fromFloat(toFloat(a) / toFloat(b)); +} + +// performance function +fixed fxAdd_performance(fixed a, fixed b) +{ + return fromFloat(toFloat(a) + toFloat(b)); +} + +fixed fxSub_performance(fixed a, fixed b) +{ + return fromFloat(toFloat(a) - toFloat(b)); +} + +fixed fxMul_performance(fixed a, fixed b) +{ + return (a>>FX_Q_NUM_H)*(b>>FX_Q_NUM_H); +} + +fixed fxDiv_performance(fixed a, fixed b) +{ + return fromFloat(toFloat(a) / toFloat(b)); +} diff --git a/lec12/fx_s17_14.h b/lec12/fx_s17_14.h new file mode 100644 index 0000000000000000000000000000000000000000..c7900f127da0cc2e5e33a9428fc9be885d7f5cf6 --- /dev/null +++ b/lec12/fx_s17_14.h @@ -0,0 +1,37 @@ +#include "fx_head.h" +#include <math.h> + +#define FX_POINT FX_S17_14 + +#define FX_Q_NUM (FX_POINT & 0xFF) // 14 + +// If you want calculate with high precision set 64 +#define FX_SYSTEM_INTEGER 64 // 32 or 64 +#define FX_SYSTEM_FLOAT 64 // 32 or 64 + +#define FX_DATA_TYPE signed int + + +typedef int fx_s17_14; +typedef fx_s17_14 fixed; + +#define fromDouble(d) ((fixed)((d)*DOUBLE_Q_VALUE)) +#define toDouble(d) ((double)(d)*DOUBLE_1_Q_VALUE) +#define fromFloat(d) ((fixed)((d)*FLOAT_Q_VALUE)) +#define toFloat(d) ((float)(d)*FLOAT_1_Q_VALUE) + +// CONSTANTS +#define FLOAT_Q_VALUE (float)(1<<FX_Q_NUM) +#define DOUBLE_Q_VALUE (double)(1<<FX_Q_NUM) +#define FLOAT_1_Q_VALUE (float)(1.0f/FLOAT_Q_VALUE) +#define DOUBLE_1_Q_VALUE (double)(1.0f/DOUBLE_Q_VALUE) +#define FX_PI fromDOUBLE(M_PI) + +// One of FX_OP_FLOAT, FX_OP_PRECISION, FX_OP_FAIR, FX_OP_PERFORMANCE +#define FX_OP_PREFERENCE FX_OP_FLOAT + +extern fixed fxAdd_float(), fxAdd_precision(), fxAdd_fair(), fxAdd_performance(); +extern fixed fxSub_float(), fxSub_precision(), fxSub_fair(), fxSub_performance(); +extern fixed fxMul_float(), fxMul_precision(), fxMul_fair(), fxMul_performance(); +extern fixed fxDiv_float(), fxDiv_precision(), fxDiv_fair(), fxDiv_performance(); + diff --git a/lec12/project_main.c b/lec12/project_main.c new file mode 100644 index 0000000000000000000000000000000000000000..15694be7c878233f11d3ec98d28c7377b32d6fcb --- /dev/null +++ b/lec12/project_main.c @@ -0,0 +1,11 @@ +#include "fx_s17_14.h" +#include <stdio.h> + + +int main() +{ + + printf("%f : %d\n",1.0, fromDouble(1.0)); + printf("%f : %f\n",1.3*0.3, toFloat(fxMul_float(fromDouble(1.3),fromDouble(0.3)))) ; + +}