deepstone

annotate src/fixedp.h @ 34:c6406e4aa0fb

better input, fixed emulated code to work again
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 23 Sep 2013 05:58:24 +0300
parents 61d97b17cd2b
children 1fa939507d8b
rev   line source
nuclear@25 1 #ifndef FIXED_POINT_H_
nuclear@25 2 #define FIXED_POINT_H_
nuclear@25 3
nuclear@25 4 #include "inttypes.h"
nuclear@25 5
nuclear@25 6 #ifdef DBG_USE_FLOAT
nuclear@25 7 typedef float fixed;
nuclear@25 8 #else
nuclear@25 9 typedef int32_t fixed;
nuclear@25 10 #endif
nuclear@25 11
nuclear@25 12 /* valid choices for DECIMAL_BITS
nuclear@25 13 * 8: for fixed point 24:8
nuclear@25 14 * 16: for fixed point 16:16
nuclear@25 15 */
nuclear@25 16 #define DECIMAL_BITS 16
nuclear@25 17
nuclear@25 18 #if DECIMAL_BITS == 8
nuclear@25 19 #define FIXED_SHIFT 8
nuclear@25 20 #define FLT_SCALE 256.0f
nuclear@25 21 #define FRAC_MASK 0xff
nuclear@25 22 #else /* DECIMAL_BITS == 16 */
nuclear@25 23 #define FIXED_SHIFT 16
nuclear@25 24 #define FLT_SCALE 65536.0f
nuclear@25 25 #define FRAC_MASK 0xffff
nuclear@25 26 #endif /* DECIMAL_BITS */
nuclear@25 27
nuclear@25 28 /*extern const fixed fixed_zero;
nuclear@25 29 extern const fixed fixed_one;
nuclear@25 30 extern const fixed fixed_half;
nuclear@25 31 extern const fixed fixed_tenth;
nuclear@25 32 extern const fixed fixed_255;*/
nuclear@25 33
nuclear@25 34 #ifdef DBG_USE_FLOAT
nuclear@25 35 /* ------- debug mode, use floating point -------- */
nuclear@25 36 #define FIXED_INT_PART(n) ((int)(n))
nuclear@25 37 #define FIXED_FRAC_PART(n) ((n) > 0.0f ? (FIXED_INT_PART(n) - (n)) : (FIXED_INT_PART(n) + (n)))
nuclear@25 38 #define FIXED_ROUND(n) FIXED_INT_PART((n) >= 0.0 ? (n) + 0.5f : (n) - 0.5f)
nuclear@25 39
nuclear@25 40 #define FIXED_TO_FLOAT(n) (n)
nuclear@25 41 #define FLOAT_TO_FIXED(n) (n)
nuclear@25 42 #define INT_TO_FIXED(n) ((float)(n))
nuclear@25 43
nuclear@25 44 #define FIXED_EPSILON (1e-6)
nuclear@25 45
nuclear@25 46 #else /* ---- really fixed point ---- */
nuclear@25 47
nuclear@25 48 #define FIXED_INT_PART(n) ((n) >> FIXED_SHIFT)
nuclear@25 49 #define FIXED_FRAC_PART(n) ((n) & FRAC_MASK)
nuclear@25 50 #define FIXED_ROUND(n) FIXED_INT_PART((n) >= 0 ? (n) + fixedf(0.5) : (n) - fixedf(0.5))
nuclear@25 51 /*#define FIXED_ROUND(n) FIXED_INT_PART(n)*/
nuclear@25 52
nuclear@25 53 #define FIXED_TO_FLOAT(n) (float)((n) / FLT_SCALE)
nuclear@25 54 #define FLOAT_TO_FIXED(n) (fixed)((n) * FLT_SCALE)
nuclear@25 55 #define INT_TO_FIXED(n) (fixed)((n) << FIXED_SHIFT)
nuclear@25 56
nuclear@25 57 #define FIXED_EPSILON (1)
nuclear@25 58
nuclear@25 59 #endif
nuclear@25 60
nuclear@25 61
nuclear@25 62 #define fixed_int(n) FIXED_INT_PART(n)
nuclear@25 63 #define fixed_frac(n) FIXED_FRAC_PART(n)
nuclear@25 64 #define fixed_float(n) FIXED_TO_FLOAT(n)
nuclear@25 65 #define fixed_round(n) FIXED_ROUND(n)
nuclear@25 66
nuclear@25 67 #define fixedf(n) FLOAT_TO_FIXED(n)
nuclear@25 68 #define fixedi(n) INT_TO_FIXED(n)
nuclear@25 69
nuclear@25 70 #define fixed_add(n1, n2) ((n1) + (n2))
nuclear@25 71 #define fixed_sub(n1, n2) ((n1) - (n2))
nuclear@25 72
nuclear@25 73
nuclear@25 74
nuclear@25 75 #ifdef DBG_USE_FLOAT
nuclear@25 76
nuclear@25 77 #define fixed_mul(n1, n2) ((n1) * (n2))
nuclear@25 78 #define fixed_div(n1, n2) ((n1) / (n2))
nuclear@25 79
nuclear@25 80 #define fixed_sin(x) (fixed)sin(x)
nuclear@25 81 #define fixed_cos(x) (fixed)cos(x)
nuclear@25 82
nuclear@25 83 #else
nuclear@25 84
nuclear@25 85 #if DECIMAL_BITS == 8
nuclear@25 86 #define fixed_mul(n1, n2) (fixed)((n1) * (n2) >> FIXED_SHIFT)
nuclear@25 87 #define fixed_div(n1, n2) (((n1) << FIXED_SHIFT) / (n2))
nuclear@25 88 #else
nuclear@27 89 #define fixed_div(n1, n2) (((n2) >> 8) ? (((n1) << 8) / ((n2) >> 8)) : (n1))
nuclear@25 90 #define fixed_mul(n1, n2) (((n1) >> 8) * ((n2) >> 8))
nuclear@25 91 #endif /* DECIMAL_BITS */
nuclear@25 92
nuclear@25 93 #ifdef __cplusplus
nuclear@25 94 extern "C" {
nuclear@25 95 #endif
nuclear@25 96
nuclear@25 97 fixed fixed_sin(fixed angle);
nuclear@25 98 fixed fixed_cos(fixed angle);
nuclear@25 99
nuclear@25 100 #ifdef __cplusplus
nuclear@25 101 }
nuclear@25 102 #endif
nuclear@25 103
nuclear@25 104 #endif
nuclear@25 105
nuclear@25 106 #endif /* FIXED_POINT_H_ */