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 _F32_H_
00039 #define _F32_H_
00040
00041 #include <aversive.h>
00042
00043 typedef struct fixed_32 {
00044 union {
00045 struct {
00046 uint16_t decimal;
00047 int16_t integer;
00048 } s;
00049 int32_t s32;
00050 } u;
00051 } f32;
00052 #define f32_decimal u.s.decimal
00053 #define f32_integer u.s.integer
00054
00055 #define F32_ZERO ( \
00056 { \
00057 f32 __f; \
00058 __f.u.s32 = 0; \
00059 __f; \
00060 })
00061
00062 #define F32_NAN ( \
00063 { \
00064 f32 __f; \
00065 __f.u.s32 = 0xFFFFFFFF; \
00066 __f; \
00067 })
00068
00069 #define F32_IS_GT(x,y) (f32_to_s32(x) > f32_to_s32(y))
00070 #define F32_IS_LT(x,y) (f32_to_s32(x) < f32_to_s32(y))
00071 #define F32_IS_GE(x,y) (f32_to_s32(x) >= f32_to_s32(y))
00072 #define F32_IS_LE(x,y) (f32_to_s32(x) <= f32_to_s32(y))
00073 #define F32_IS_EQ(x,y) (f32_to_s32(x) == f32_to_s32(y))
00074 #define F32_IS_NE(x,y) (f32_to_s32(x) != f32_to_s32(y))
00075 #define F32_IS_NEG(x) ((x).f32_integer < 0)
00076 #define F32_IS_ZERO(x) ((x).f32_integer == 0 && (x).f32_decimal == 0)
00077
00079 f32 f32_from_double(double f);
00080
00082 double f32_to_double(f32 fix);
00083
00085 f32 f32_from_integer(int16_t i, uint16_t d);
00086
00088 f32 f32_from_msb(int16_t i);
00089
00093 f32 f32_from_lsb(int16_t i);
00094
00096 f32 f32_neg(f32 f);
00097
00099 f32 f32_add(f32 a, f32 b);
00100
00102 f32 f32_sub(f32 a, f32 b);
00103
00105 f32 f32_inv(f32 f);
00106
00108 f32 f32_mul(f32 a, f32 b);
00109
00111 f32 f32_mul_msb(f32 a, f32 b);
00112
00114 f32 f32_div(f32 a, f32 b);
00115
00117 f32 f32_sqrt(f32 f);
00118
00120 void f32_print(f32 fix);
00121
00122 #endif