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 #include <aversive.h>
00039
00040 #ifndef _F64_H_
00041 #define _F64_H_
00042
00043 typedef struct fixed_64 {
00044 union {
00045 struct {
00046 uint32_t decimal;
00047 int32_t integer;
00048 } s;
00049 int64_t s64;
00050 } u;
00051 } f64;
00052 #define f64_integer u.s.integer
00053 #define f64_decimal u.s.decimal
00054
00055 #define F64_ZERO ( \
00056 { \
00057 f64 __f; \
00058 __f.u.s64 = 0; \
00059 __f; \
00060 })
00061
00062 #define F64_NAN ( \
00063 { \
00064 f64 __f; \
00065 __f.u.s64 = 0xFFFFFFFFFFFFFFFF; \
00066 __f; \
00067 })
00068
00069 #define F64_IS_GT(x,y) (f64_to_s64(x) > f64_to_s64(y))
00070 #define F64_IS_LT(x,y) (f64_to_s64(x) < f64_to_s64(y))
00071 #define F64_IS_GE(x,y) (f64_to_s64(x) >= f64_to_s64(y))
00072 #define F64_IS_LE(x,y) (f64_to_s64(x) <= f64_to_s64(y))
00073 #define F64_IS_EQ(x,y) (f64_to_s64(x) == f64_to_s64(y))
00074 #define F64_IS_NE(x,y) (f64_to_s64(x) != f64_to_s64(y))
00075 #define F64_IS_NEG(x) ((x).f64_integer < 0)
00076 #define F64_IS_ZERO(x) ((x).f64_integer == 0 && (x).f64_decimal == 0)
00077
00078
00080 f64 f64_from_double(double f);
00081
00083 double f64_to_double(f64 fix);
00084
00086 f64 f64_from_integer(int32_t i, uint32_t d);
00087
00089 f64 f64_from_msb(int32_t i);
00090
00094 f64 f64_from_lsb(int32_t i);
00095
00097 f64 f64_neg(f64 f);
00098
00100 f64 f64_add(f64 a, f64 b);
00101
00103 f64 f64_sub(f64 a, f64 b);
00104
00106 f64 f64_inv(f64 f);
00107
00109 f64 f64_mul(f64 a, f64 b);
00110
00112 int32_t f64_msb_mul(f64 a, f64 b);
00113
00115 f64 f64_div(f64 a, f64 b);
00116
00118 f64 f64_sqrt(f64 f);
00119
00121 void f64_print(f64 fix);
00122
00123 #endif