00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef _F16_H_
00039 #define _F16_H_
00040
00041 #include <aversive.h>
00042
00043 typedef struct fixed_16 {
00044 union {
00045 struct {
00046 uint8_t decimal;
00047 int8_t integer;
00048 } s;
00049 int16_t s16;
00050 } u;
00051 } f16;
00052 #define f16_decimal u.s.decimal
00053 #define f16_integer u.s.integer
00054
00055 #define F16_ZERO ( \
00056 { \
00057 f16 __f; \
00058 __f.u.s16 = 0; \
00059 __f; \
00060 })
00061
00062 #define F16_NAN ( \
00063 { \
00064 f16 __f; \
00065 __f.u.s16 = 0xFFFF; \
00066 __f; \
00067 })
00068
00069 #define F16_IS_GT(x,y) (f16_to_s16(x) > f16_to_s16(y))
00070 #define F16_IS_LT(x,y) (f16_to_s16(x) < f16_to_s16(y))
00071 #define F16_IS_GE(x,y) (f16_to_s16(x) >= f16_to_s16(y))
00072 #define F16_IS_LE(x,y) (f16_to_s16(x) <= f16_to_s16(y))
00073 #define F16_IS_EQ(x,y) (f16_to_s16(x) == f16_to_s16(y))
00074 #define F16_IS_NE(x,y) (f16_to_s16(x) != f16_to_s16(y))
00075 #define F16_IS_NEG(x) ((x).f16_integer < 0)
00076 #define F16_IS_ZERO(x) ((x).f16_integer == 0 && (x).f16_decimal == 0)
00077
00078
00080 f16 f16_from_double(double f);
00081
00083 double f16_to_double(f16 fix);
00084
00086 f16 f16_from_integer(int8_t i, uint8_t d);
00087
00089 f16 f16_from_msb(int8_t i);
00090
00094 f16 f16_from_lsb(int8_t i);
00095
00097 f16 f16_neg(f16 f);
00098
00100 f16 f16_add(f16 a, f16 b);
00101
00103 f16 f16_sub(f16 a, f16 b);
00104
00106 f16 f16_inv(f16 f);
00107
00109 f16 f16_mul(f16 a, f16 b);
00110
00112 f16 f16_mul_msb(f16 a, f16 b);
00113
00115 f16 f16_div(f16 a, f16 b);
00116
00118 f16 f16_sqrt(f16 f);
00119
00121 void f16_print(f16 fix);
00122
00123 #endif