2010年9月4日土曜日

小数点演算の単精度化

  STM32に小数点演算をさせる場合は倍精度だと時間がかかるし,倍精度も必要無いので単精度で計算すべきだろうと思う.つまり全ての浮動小数点変数はfloatで宣言し,浮動小数点定数は1234Fのようにfloat型であることを明示すべき.特に定数値は数値だけ書くと倍精度として扱われるので,途中の演算が倍精度で行われて時間がかかるだけでなく,代入の時に単精度に変換することになるのでよけいにかかる.

  私のマウスは現状定数には何もつけていなので倍精度で計算されていることになる.全部定数にFをつけるのが面倒だなあとか思っていたが,やはりそういうコンパイルオプションはあるらしく,
    -fsingle-precision-constant
とすると定数が全て単精度になるらしい.(GCC以外にこのオプションがあるかどうかは知らない)

  以下,このオプションを付けない場合の調査結果.ただし,一定時間毎に割り込みがかかってたりするので計算時間の絶対値に意味はない.

1. 304ms
    float temp=1.0;
    for(int i=0;i<100000;i++) temp = temp * 1.0001;

2. 116ms
    float temp=1.0;
    for(int i=0;i<100000;i++) temp = temp * 1.0001F;

3. 225ms
    double temp=1.0;
    for(int i=0;i<100000;i++) temp = temp * 1.0001;

4. 406ms
    float temp=1.0;
    for(int i=0;i<100000;i++) temp = temp / 0.9999F;

1 件のコメント:

福井 さんのコメント...

これは地味に良記事.

コメントを投稿