マイクロコントローラーの固定小数点演算


12

多くの場合、ロボットで物事を行うためにマイクロコントローラーを使用しますが、いくつかの計算を10進数で行う必要があります。ソフトウェアの浮動小数点ライブラリが自動的に含まれるため(ハイエンドのマイクロコントローラーがない場合)、浮動小数点変数の使用は非常に遅くなります。したがって、通常は固定小数点演算を使用します。

これを行うときは常に、整数を使用し、小数点以下の桁数を覚えています。ただし、特に小数点が別の場所にある変数が計算に含まれる場合は、すべてが一貫していることを確認するために注意が必要です。

私は固定小数点atan2関数を実装しましたが、限られた精度(16ビット)の最後のすべてのドロップを絞り込もうとしていたため、小数点の位置の定義を頻繁に変更し、微調整すると変更されます。さらに、疑似ルックアップテーブルとしていくつかの定数があり、それらは暗黙の小数点をどこかに持っています。

もっと良い方法があるかどうか知りたい。固定小数点変数の使用を簡略化し、混合変数間の乗算と除算を容易にし、10進数または定数式の宣言を許可しながら、コンパイル時に目的の固定小数点表現に自動的に変換できるライブラリまたはマクロセットはありますか時間?


1
ソリューションは一般的なものであり、ロボット工学とはあまり関係がないため、これは実際にはスタックオーバーフローに適しています。
Shahbaz

1
@Jakob-これらの質問はどちらも建設的ではないためクローズされました。
マークブース

1
これは、C ++を組み込みシステムに非常に役立つものにするようなものです。テンプレートは自動的に正しい最適なコードを生成します。
Rocketmagnet、

1
atan関数を確認できますか?私の学術研究では、浮動小数点から固定小数点への変換の問題に取り組んでいるので、試してみたいと思います。
Joe Hass

1
@ronalchn Arduino(AVRマイクロ)言語の一部はC ++で実装されています。AVR C ++ライブラリもあります。そしてコンパイラが使用するこのスレッド
embedded.kyle

回答:


7

コンパイラーに各固定小数点入力変数の範囲と精度(おそらく、基数ポイントが同じ場所にある2つはない)を伝えることができ、それが自動的に-コンパイル時に-正しい範囲を使用するとよい一連の計算における中間値と最終値の精度と再スケーリング操作。Adaプログラミング言語またはC ++テンプレートでそれを実行できる可能性があるという噂を聞きました。

悲しいかな、私が見た中で最も近いのは、プログラマーが正しい表現を手動で選択し、各操作が適切な範囲と精度を維持していることを手動で確認する必要がある固定小数点算術ライブラリーです。時には、それらは混合変数間の乗算と除算をより簡単にします。といった:


C ++テンプレートを使用してこれを行うことはほぼ確実に可能です。
Rocketmagnet

私は実際にあなたの「もしよかったら…」というコメントのようなものに取り組んでいます。これは、浮動小数点Cコードを固定小数点に変換し、途中ですべての2進小数点の位置を最適化するgccのプラグインです。ACMジャーナルに論文を提出しており、もう1つは準備中です。atan関数のCコードがあれば、喜んで試してみます...整数変数を使用し、すべての固定小数点の処理を行うCコードを返すことができます。
Joe Hass

+1は私のものよりもはるかに完全な答えです。私はリンクを編集して、Mark Boothのコメントに対処するためのソースコードを要求する場所へのリンクを含めました。リンクを更新することもできます。私はそれを自分で行いますが、提案された編集がキューにあり、私をブロックしています。
embedded.kyle

1
@Rocketmagnetそれは最も確かにテンプレートを使用して固定ポイントを実装することが可能で、参照FixedPoints(免責事項を:私はこれを書いて、それはまだ非常に「若い」です)。
Pharap、2018

gccリンク "a"が壊れています
Lesto

2

TI IQMathライブラリを使用して、固定小数点DSPに仮想浮動小数点を実装しました。

Texas Instruments TMS320C28x IQmathライブラリは、C / C ++プログラマーが浮動小数点アルゴリズムをTMS320C28xデバイスの固定小数点コードにシームレスに移植するための高度に最適化された高精度の数学関数のコレクションです。これらのルーチンは通常、最適な実行速度と高精度が重要な計算集約型のリアルタイムアプリケーションで使用されます。これらのルーチンを使用することにより、標準のANSI C言語で記述された同等のコードよりもかなり高速に実行速度を実現できます。さらに、すぐに使用できる高精度関数を提供することにより、TI IQmathライブラリはDSPアプリケーションの開発時間を大幅に短縮できます。

それはいくつかのTI固有のものを使用しますが、他のマイクロコントローラーで仮想浮動小数点演算を実装するためのベースとしてそのコードも使用しました。移植には少し手間がかかりますが、ゼロから始めるよりもはるかに簡単です。


@downvoter私の答えのどこが悪いのかコメントしてください。
embedded.kyle

+1:このライブラリは、彼が現在使用しているものよりも優れています(「整数を使用する」)。それは元の質問が求めたすべてを実行するわけではありませんが、このような答え(有用ではあるが完全な解決策ではない)は、完全な解決策が実際に存在しない限り(この場合は疑問です)、反対票を投じる価値はないと思います。 )。
David Cary

単一の範囲のデバイスに固有であり、スピーチでなくビールの場合にのみ無料である回答は、将来の訪問者にはあまり使用されないように思えます。
マークブース

@MarkBoothリンクをC28xライブラリからC64xライブラリに変更しました。このリンクをクリックすると、ソースコードをリクエストできます。アクセスするには会社または大学のメールが必要です。ビールスピーチのようにまだ無料です。話しかける前に、手を挙げて呼び出されるのを待つだけです。少し面倒ですが、ソースコードを入手したら、好きなプロセッサに適応させることができます。
embedded.kyle

ありがとう@ embedded.kyleソースコードはバイナリのみよりも間違いなく優れていますが、ライセンスで限られた方法でしか使用できない場合は、まだ一般的にはほとんど使用できません。C6x Software Librariesのページによると、そのソースはTI商用ライセンスの下でのみリリースされており、ほとんどの場合、スピーチのように無料ではありません。
マークブース

1

Binary Scaling(aka B-scaling)の実装はたくさんあります(すぐに気付くライブラリはありません)。

これでは、シフトを使用して小数点を上下に移動させて、小数点の位置についての精神的なメモを保持します(さらに言えば、コードを文書化します...)。

私は、最小のCPUでも、防御プロジェクトのアセンブラーでBスケーリングを使用したので、他のものへの適合性を保証できます...


おそらくこのようなものですが、bスケーリングと呼ばれるものを見たことがありません。私は、固定小数点と考える-小数点は、いずれかの変数は常に小数点が特定の場所に固定されており、計算の過程で変更される可能性があるにもかかわらずあるため、小数点を浮動されることはありません
ronalchn

0

整数を使用して「ポイント」がどこにあるかを覚えている場合、それらは一種の浮動小数点演算使用しています。固定小数点、本当に固定小数点があります。

atancosππ

これは、アプリケーションが必要とする値の範囲によって異なりますが、完全に固定小数点表現に移行したい場合があります。つまり、たとえば、次のような数値を保持する代わりに:

struct num
{
    uint16_t number;
    uint16_t decimal_point;
};

どこnumber全体の数で、decimal_point小数点がある場合、あなたはこのようにそれを保存することができます言います:

struct num
{
    uint16_t integer;
    uint16_t fraction;
};

ここで、整数はinteger.fractionであり、メモリ使用量は同じで、値の範囲が広く、一般に使用が簡単です。


実際に小数点を格納すると、浮動小数点のようになります。通常、小数点はコンパイル時に定義され、操作に応じて表現を切り替えます。
ジェイコブ

変数に格納されているように覚えていることを意味するのではなく、結果を解釈する方法を(小数点がどこにあるかを知ることによって)覚えているように覚えていることを意味します
ronalchn

@ronalchn、なるほど。あなたはで何かを意味したの#defineでしょう?実際に保存すると思いましたが、数の大小によって変わる場合があります。
Shahbaz 2012年

@ronalchn-Bスケーリングを考えていますか?(私の答えを参照)
アンドリュー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.