4

double を整数部分と小数部分に分割しようとしています。私のコードは動作しますが、私が使用しているマイクロコントローラにはアセンブリに専用の乗算命令がないため、遅すぎます。例えば、

temp = ((int)(tacc - temp); // This line takes about 500us

しかし、私がこれを行うと、

temp = (int)(100*(tacc-temp)); // This takes about 4ms

マイクロコントローラーを高速化することはできますが、低電力を維持しようとしているので、これを高速化できるかどうかに興味があります。これは、私が実際に最適化に興味を持っている小さな部分です:

    txBuffer[5] = ((int)tacc_y); // Whole part
    txBuffer[6] = (int)(100*(tacc_y-txBuffer[5])); // 2 digits of fraction

次のように、シフトを使用して 10 を掛ける高速な方法があることを覚えています。

a * 10 = (a << 2 + a) << 1

おそらくこれを入れ子にして、100倍にすることもできます。他に方法はありますか?

4

2 に答える 2

2

最速ではないかもしれない正しい答えはこれだと思います:

double whole = trunc(tacc_y);
double fract = tacc_y - whole;

// first, extract (some of) the data into an int
fract = fract * (1<<11);         // should be just an exponent change
int ifract = (int)trunc(fract);

// next, decimalize it (I think)
ifract = ifract * 1000;          // Assuming integer multiply available
ifract = ifract >> 11;

txBuffer[5] = (int)whole;
txBuffer[6] = ifract

整数の乗算に問題がある場合は、シフト トリックが機能するはずです。

浮動小数点乗算が愚かすぎて指数をすばやく編集できない場合は、ビットをいじって手動で行うことができますが、最初のオプションとしてはお勧めしません。いずれにせよ、ビットをいじる FP 数まで取得したら、仮数を抽出するか、操作全体を手動で行うこともできます。

于 2013-07-05T15:54:32.993 に答える