0

長文タイトルで申し訳ありません。私のコードは、浮動小数点ユニットのないマイクロコントローラー (msp430) をターゲットにしていますが、これは同様の MCU に適用されるはずです。

大きなランタイム変数を、通常は浮動小数点 10 進数 (1.8) と見なされるもので乗算している場合、これは MCU またはコンパイラによって浮動小数点演算のように扱われますか?

私の簡略化されたコードは次のとおりです。

int multip = 0xf;          // Can be from 0-15, not available at compile time
int holder = multip * 625; // 0 - 9375
holder = holder * 1.8;     // 0 - 16875`

結果は常に正の完全な実数になるため、MCU またはコンパイラに関する限り、浮動小数点演算ですか、それとも固定小数点演算ですか?

(18を掛けるだけでよいことに気づきましたが、それには16ビットのintの代わりに32ビットのlongを宣言し、それが配置される配列の分割とダウンキャストが必要になり、ここでメモリを節約しようとします)

4

4 に答える 4

2

浮動小数点の乗算を記述した場合、代わりに固定小数点でそれを行う方法があると判断するコンパイラを私は知りません。(それはそれらが存在しないという意味ではありませんが、それは...ありそうにないようです。)

次のことができるように見えるので、重要なことを単純化したと思います。

result = multip * 1125;

最終結果を直接取得します。

何らかの理由で 1125 を掛けることができない場合は、chux の式を使用します。

于 2013-09-18T00:20:37.923 に答える
0

安心のFPコードを作成します

holder = holder * 1.8

FP と 32 ビット演算を回避するには、次の OP 値が与えられます。

int multip = 0xf;    // Max 15
unsigned holder = multip * 625; // Max 9375
// holder = holder * 1.8; 
// alpha depends on rounding desired,  e.g. 2 for round to nearest.
holder += (holder*4u + alpha)/5;
于 2013-09-18T00:15:21.213 に答える