FIXDEC.H
[目次 | 型・クラス・構造体 | マクロ]
1|/**************************************************************************
2|* 1. <<< 固定小数型 [fixdec] >>>
3|*
4|*・整数型を用いた小数です。
5|*・小数を用いる計算を速くします。
6|*
7|* 2. <<< 整数型と固定小数型の変換 >>>
8|*
9|* 使う場面によって、シフトするビット数(シフト・レベル)を
10|* 使い分けます。
11|* ・fixdec = int << 8;
12|* ・fixdec = (int)(float*(1<<8));
13|* ・int = fixdec + f*(1<<7) >> 8;
14|* ・#define Scale2_fixdec 8 // 固定小数のシフト・レベル
15|* f は、対応する fixdec の符号が正なら 1 負なら -1。
16|*
17|* 3. <<< 浮動小数型と固定小数型の変換 >>>
18|*
19|*・int 型に出来る変数を見つける
20|* a = ax/ay; を a = (int)(ax/ay); にしてみる。
21|*・シフトレベルを調節する
22|*・シフトマクロを用いる
23|*
24|* 4. <<< 代入、加減算 >>>
25|*
26|* fixdec 型で。
27|* ・fixdec += fixdec;
28|* ・fixdec += int << 8;
29|*
30|* 5. <<< 乗除算 >>>
31|*
32|*・乗除算は、int 型、またはシフトで。
33|* 四捨五入を忘れないこと。
34|* ・fixdec *= int;
35|* ・fixdec = fixdec * fixdec + (1<<7) >> 8; ... オーバーフローに注意
36|* ・fixdec *= fixdec >> 8; ... 右辺の切り捨て
37|* ・fixdec = (fixdec + f*(1<<7) >> 8) * fixdec; ... 左辺の切り捨て
38|*
39|* ・fixdec = fixdec / int;
40|* ・fixdec = ((fixdec << 8) + f*(1<<7)) / fixdec; ... オーバーフローに注意
41|* ・fixdec = (fixdec + f*(1<<7)) / fixdec << 8; ... 答え切り捨て
42|* ・fixdec = fixdec / (fixdec >> 8); ... 右辺の切り捨て
43|* f は、対応する fixdec の符号が正なら 1 負なら -1。
44|*
45|*・int 型に fixdec 型を乗除算して答を int にする場合もシフトで。
46|* ・int = int * fixdec + f*128 >> 8; ... オーバーフローに注意
47|* ・fixdec *= fixdec >> 8; ... 右辺の切り捨て
48|*
49|* ・int = (int << 8 + f*128 ) / fixdec; ... 左辺のオーバーフローに注意
50|* ・int = ((int + f*128) / fixdec) << 8 ; ... 切り捨て
51|*
52|*************************************************************************/
53|
54|typedef int fixdec;
55|
56|
57|/**************************************************************************
58|* 6. <<< シフト・マクロ [SFT] >>>
59|*************************************************************************/
60|#define SFT2 (8)
61|#if 0 /* LEVEL 0 */
62|#define SFT2_L(f) (f) /* 浮動小数を左シフト */
63|#define SFT2_R(f) (f) /* 浮動小数を右シフト */
64|#endif
65|#if 0 /* LEVEL 1 */
66|#define SFT2_L(f) ((f)*(1<<SFT2)) /* 浮動小数を左シフト */
67|#define SFT2_R(f) ((f)/(1<<SFT2)) /* 浮動小数を右シフト */
68|#endif
69|#if 1 /* LEVEL 2 */
70|#define SFT2_L(f) ((int)((f)*(1<<SFT2))) /* 浮動小数を左シフト */
71|#define SFT2_R(f) ((int)((f)/(1<<SFT2))) /* 浮動小数を右シフト */
72|/*#define SFT2_R(f) ((int)( (f)>=0 ?(f) :-(f) /(1<<SFT2))) /* 浮動小数を右シフト */
73|#endif
74|#if 0 /* LEVEL 3 */
75|#define SFT2_L(f) ( (int)(f)<<SFT2 ) /* 浮動小数を左シフト */
76|#define SFT2_R(f) ( (int)(f)>>SFT2 ) /* 浮動小数を右シフト */
77|#endif
78|
79|