From 8289b8e39402dab1d82d222149d8857e8e9b28ee Mon Sep 17 00:00:00 2001 From: KimNayoung <skdud1201@ajou.ac.kr> Date: Sun, 30 Jan 2022 04:11:20 +0900 Subject: [PATCH] lec12 --- lec12/fx_s17_14.c | 100 +++++++++++++++++++++++++++++++++++++++++++ lec12/fx_s17_14.h | 37 ++++++++++++++++ lec12/project_main.c | 11 +++++ 3 files changed, 148 insertions(+) create mode 100644 lec12/fx_s17_14.c create mode 100644 lec12/fx_s17_14.h create mode 100644 lec12/project_main.c diff --git a/lec12/fx_s17_14.c b/lec12/fx_s17_14.c new file mode 100644 index 0000000..b8e3b4b --- /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 0000000..c7900f1 --- /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 0000000..15694be --- /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)))) ; + +} -- GitLab