● 実行速度について - 乗除算を避ける・変更する
小数点の移動
小数点以下を求める場合、値を 10n 倍して小数点を移動させますが、計算結果を直に見るのでなければ、倍率を 2m に変更すると、処理を軽くする事ができます。
「小数点以下の計算」の説明では、小数点の移動を 10進数で行っていますが、その基数を 2進数に変更します。
fixed_lshift(x,m,SIZE); /* x × 2^m */
基数を 2進数に変換する事で、倍率計算のための乗算を m ビットの左シフトに置き換える事ができます。小数点の位置を元へ戻す時も、10n の除算ではなく m ビットの右シフトに置き換える事ができます。
さらに、倍率をバイト単位にできる場合は、単純なメモリコピーに置き換える事ができます。
FIXEDVAL mx[SIZE * 2];
/* x × 2^SIZE */
memcpy(mx + SIZE,x ,SIZE); /* 上位側にx をコピー */
memset(mx,0,SIZE); /* 下位側はゼロクリア */
この場合、小数点は FIXEDVAL値 mx の中間に位置する事になります。コンパイラの最適化が有効な場合、memcpy 、memset の関数呼び出しのオーバーヘッドが発生しない事は、「ユーティリティー関数の呼び出しを避ける」の中で述べた通りです。
この方法は、ビットシフトを多用したものよりも効率的になりますが、数値幅が大きくなり過ぎないように注意する必要があります。