@@ -88,6 +88,37 @@ typedef int8_t twin_gfixed_t;
88
88
#define twin_fixed_to_sfixed (f ) ((twin_sfixed_t) ((f) >> 12))
89
89
90
90
#define twin_sfixed_to_dfixed (s ) (((twin_dfixed_t) (s)) << 4)
91
+ #define twin_dfixed_to_sfixed (d ) ((twin_sfixed_t) ((d) >> 4))
92
+
93
+ /*
94
+ * twin_sfixed_t a = b'10100;
95
+ * twin_sfixed_t b = b'10000;
96
+ * exact a is 1*(2^0) + 1*(2^(-2)) = 1.25
97
+ * exact b is 1*(2^0) = 1
98
+ *
99
+ * The result of twin_sfixed_div(a, b) is of type twin_sfixed_t
100
+ * (a << 4) / (b) = (b'101000000) / (b'10000) = b'10100
101
+ * exact result is 1*(2^0) + 1*(2^(-2)) = 1.25
102
+ *
103
+ * twin_dfixed_t a = b'10100;
104
+ * twin_dfixed_t b = b'10000;
105
+ * exact a is 1*(2^(-4)) + 1*(2^(-6)) = 0.078125
106
+ * exact b is 1*(2^(-4)) = 0.0625
107
+ *
108
+ * The result of twin_dfixed_mul(a, b) is of type twin_dfixed_t
109
+ * (a * b) >> 8 = (b'101000000) >> 8 = b'1
110
+ * exact result is 1*(2^(-8)) = 0.00390625
111
+ */
112
+
113
+ #define twin_sfixed_mul (a , b ) \
114
+ ((((twin_sfixed_t) (a)) * ((twin_sfixed_t) (b))) >> 4)
115
+ #define twin_sfixed_div (a , b ) \
116
+ ((((twin_sfixed_t) (a)) << 4) / ((twin_sfixed_t) (b)))
117
+
118
+ #define twin_dfixed_mul (a , b ) \
119
+ ((((twin_dfixed_t) (a)) * ((twin_dfixed_t) (b))) >> 8)
120
+ #define twin_dfixed_div (a , b ) \
121
+ ((((twin_dfixed_t) (a)) << 8) / ((twin_dfixed_t) (b)))
91
122
92
123
/*
93
124
* 'double' is a no-no in any shipping code, but useful during
0 commit comments