deepstone

view src/fixedp.h @ 40:1fa939507d8b

fast floating point->int conversion
author John Tsiombikas <nuclear@member.fsf.org>
date Fri, 15 Sep 2017 05:00:37 +0300
parents dcfe615c4c5f
children
line source
1 #ifndef FIXED_POINT_H_
2 #define FIXED_POINT_H_
4 #include "inttypes.h"
6 #ifdef DBG_USE_FLOAT
7 typedef float fixed;
8 #else
9 typedef int32_t fixed;
10 #endif
12 /* valid choices for DECIMAL_BITS
13 * 8: for fixed point 24:8
14 * 16: for fixed point 16:16
15 */
16 #define DECIMAL_BITS 16
18 #if DECIMAL_BITS == 8
19 #define FIXED_SHIFT 8
20 #define FLT_SCALE 256.0f
21 #define FRAC_MASK 0xff
22 #else /* DECIMAL_BITS == 16 */
23 #define FIXED_SHIFT 16
24 #define FLT_SCALE 65536.0f
25 #define FRAC_MASK 0xffff
26 #endif /* DECIMAL_BITS */
28 /*extern const fixed fixed_zero;
29 extern const fixed fixed_one;
30 extern const fixed fixed_half;
31 extern const fixed fixed_tenth;
32 extern const fixed fixed_255;*/
34 static __inline long cround64(double val)
35 {
36 val += 6755399441055744.0;
37 return *(long*)&val;
38 }
40 #ifdef DBG_USE_FLOAT
41 /* ------- debug mode, use floating point -------- */
42 #define FIXED_INT_PART(n) ((int)(n))
43 #define FIXED_FRAC_PART(n) ((n) > 0.0f ? (FIXED_INT_PART(n) - (n)) : (FIXED_INT_PART(n) + (n)))
44 #define FIXED_ROUND(n) FIXED_INT_PART((n) >= 0.0 ? (n) + 0.5f : (n) - 0.5f)
46 #define FIXED_TO_FLOAT(n) (n)
47 #define FLOAT_TO_FIXED(n) (n)
48 #define INT_TO_FIXED(n) ((float)(n))
50 #define FIXED_EPSILON (1e-6)
52 #else /* ---- really fixed point ---- */
54 #define FIXED_INT_PART(n) ((n) >> FIXED_SHIFT)
55 #define FIXED_FRAC_PART(n) ((n) & FRAC_MASK)
56 #define FIXED_ROUND(n) FIXED_INT_PART((n) >= 0 ? (n) + fixedf(0.5) : (n) - fixedf(0.5))
57 /*#define FIXED_ROUND(n) FIXED_INT_PART(n)*/
59 #define FIXED_TO_FLOAT(n) (float)((n) / FLT_SCALE)
60 #define FLOAT_TO_FIXED(n) (fixed)((n) * FLT_SCALE)
61 #define INT_TO_FIXED(n) (fixed)((n) << FIXED_SHIFT)
63 #define FIXED_EPSILON (1)
65 #endif
68 #define fixed_int(n) FIXED_INT_PART(n)
69 #define fixed_frac(n) FIXED_FRAC_PART(n)
70 #define fixed_float(n) FIXED_TO_FLOAT(n)
71 #define fixed_round(n) FIXED_ROUND(n)
73 #define fixedf(n) FLOAT_TO_FIXED(n)
74 #define fixedi(n) INT_TO_FIXED(n)
76 #define fixed_add(n1, n2) ((n1) + (n2))
77 #define fixed_sub(n1, n2) ((n1) - (n2))
81 #ifdef DBG_USE_FLOAT
83 #define fixed_mul(n1, n2) ((n1) * (n2))
84 #define fixed_div(n1, n2) ((n1) / (n2))
86 #define fixed_sin(x) (fixed)sin(x)
87 #define fixed_cos(x) (fixed)cos(x)
89 #else
91 #if DECIMAL_BITS == 8
92 #define fixed_mul(n1, n2) (fixed)((n1) * (n2) >> FIXED_SHIFT)
93 #define fixed_div(n1, n2) (((n1) << FIXED_SHIFT) / (n2))
94 #else
95 #define fixed_div(n1, n2) (((n2) >> 8) ? (((n1) << 8) / ((n2) >> 8)) : (n1))
96 #define fixed_mul(n1, n2) (((n1) >> 8) * ((n2) >> 8))
97 #endif /* DECIMAL_BITS */
99 #ifdef __cplusplus
100 extern "C" {
101 #endif
103 fixed fixed_sin(fixed angle);
104 fixed fixed_cos(fixed angle);
106 #ifdef __cplusplus
107 }
108 #endif
110 #endif
112 #endif /* FIXED_POINT_H_ */