#pragma once #include #include typedef int64_t fp4816_t; #define FP4816_FRAC 16 #define FP4816_MASK (0xFFFFFFFFFFFFFFFF >> (64-FP4816_FRAC)) float fp4816_to_float (fp4816_t value); fp4816_t fp4816_from_float (float value); #define fp4816_from_float_c( value ) ((fp4816_t)(value * 65536.0f)) static inline fp4816_t fp4816_from_int32 (int32_t value) { return (fp4816_t)(((fp4816_t)value) << FP4816_FRAC); }; static inline int32_t fp4816_to_int32 (fp4816_t value) { return (int32_t)(value >> 16); }; static inline fp4816_t fp4816_fraction (fp4816_t value) { return value & FP4816_MASK; }; static inline fp4816_t fp4816_add ( fp4816_t a, fp4816_t b ) { return a + b; }; static inline fp4816_t fp4816_sub ( fp4816_t a, fp4816_t b ) { return a - b; }; static inline fp4816_t fp4816_mul ( fp4816_t a, fp4816_t b ) { return (fp4816_t)( ((int64_t)a * (int64_t)b) >> FP4816_FRAC ); }; static inline fp4816_t fp4816_div ( fp4816_t a, fp4816_t b ) { return (fp4816_t)( ((int64_t)a << FP4816_FRAC) / b ); }; static inline fp4816_t fp4816_abs ( fp4816_t a ) { return (a<0) ? -a : a; }; fp4816_t fp4816_taylor (fp4816_t v,int lev); fp4816_t fp4816_sin_slow (fp4816_t rad); fp4816_t fp4816_taylor_element(fp4816_t v,int lev); fp4816_t fp4816_pow (fp4816_t v,int pow); struct _fp4816_smoother { fp4816_t value, sum, k; }; fp4816_t fp4816_smoother(struct _fp4816_smoother *smoother,fp4816_t sample); static inline void fp4816_smoother_set(struct _fp4816_smoother *smoother,fp4816_t tn) { if (smoother) { smoother->value = 0; smoother->sum = 0; smoother->k = fp4816_div(65536,tn); }; }; #include #define FP4816_PI fp4816_from_float_c(M_PI) #define FP4816_2PI (2 * FP4816_PI) #define FP4816_05PI (FP4816_PI / 2) #define FP4816_15PI (FP4816_PI + FP4816_05PI) #define FP_SQRT_2 fp4816_from_float_c(1.414213562373095) #define FP_INV_SQRT_2 fp4816_from_float_c(0.707106781) #define FP_SQRT_3 fp4816_from_float_c(1.73205080756887729352) #define FP_INV_SQRT_3 fp4816_from_float_c(0.577350269) #ifdef __cplusplus class FP4816 { public: FP4816(int64_t value); FP4816(float value); private: int64_t value; }; #endif