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|