3

現在、MicrochipのFixed Point Libraryを使用していますが、これはほとんどのFixedPointLibraryに当てはまると思います。Q15およびQ15.16タイプ、それぞれ16ビットおよび32ビットデータをサポートします。

私が気づいたことの1つは、加算、減算、乗算、除算の関数が含まれていないことです。

これらをどのように行うのですか?整数の数学を使ってそれらを足し算/引き算/掛け算/割り算するのと同じくらい簡単ですか?足し算と引き算が機能しているのがわかりますが、掛け算や割り算では小数部分は処理されません...?

4

2 に答える 2

1

Microsoftライブラリには、アンダーフロー/オーバーフローを処理する加算および減算の関数(_Q15addおよび_Q15sub)が含まれています。

乗算はアセンブリ関数として実装できます(コードは良いと思います-これはメモリからのものです)。

C呼び出しプロトタイプは次のとおりです。

extern _Q15 Q15mpy(_Q15 a, _Q15 b);

ルーチン(プロジェクトの.sソースファイルに配置)は次のとおりです。

.global _Q15mpy
_Q15mpy:
mul.ss w0, w1, w2        ; signed multiple parameters, result in w2:w3
SL w2, w2            ; place most significant bit of W2 in carry
RLC w3, w0           ; rotate left carry into w3; result in W0
return                        ; return value in W0

。終わり

libq.hを含めることを忘れないでください

このルーチンは、結果に対して15ビットの右シフトではなく、1ビットの左シフトを実行します。Q15の数値は常に<=1の大きさであるため、オーバーフローの懸念はありません。

于 2015-06-25T19:59:05.853 に答える
0

数値の表現方法により、すべての基本的な算術関数はネイティブ演算子を使用して実行されることがわかります。たとえば、divideは/演算子を使用して*演算子を乗算し、これらは単純な32ビットの除算と乗算にコンパイルされます。

于 2010-12-06T17:09:37.263 に答える