私はダブルスを使用するCコードを持っています。私は、DSP(TMS320)でコードを実行できるようにしたい。しかしDSPは倍精度をサポートしておらず、固定小数点数しかサポートしていません。コードを固定小数点に変換する最善の方法は何ですか?固定小数点数(整数として実装されている)に適したCライブラリがありますか?浮動小数点Cコードを固定小数点に変換するにはどうすればよいですか?
答えて
TIは「IQmath」と呼ばれる固定小数点ライブラリを提供します:変換
http://focus.ti.com/lit/sw/sprc990/sprc990.pdf
は、あなたの現在のコードを分析する必要 - 各変数のためにあなたはそれが保持できる範囲かを知る必要があり、どのような精度は必要。次に、どのタイプを格納するかを決めることができます。IQMathはq30から+/- 2の範囲と0.0000000001〜q1の精度を持ち、範囲は〜+/- 100万で精度は0.5です。おそらく変数の範囲をオーバーフローすることができます操作について
、あなたがオーバーフローのためのチェックを追加し、それを処理する方法を決定する必要がある - など、最大でそれをピン、異なるスケールで保存し、エラーを発生させる
実際には、プロセスのデータフローを深く理解することなく、固定小数点に変換する方法はありません。
ほとんどのDSPツールチェーンには、ソフトウェアの浮動小数点エミュレーション用ライブラリが含まれています。これは遅くなりますが、最初に浮動小数点サポートでコードを構築してから、十分な性能を得るために固定小数点に変換する必要がある場所がいくつかあるかどうかを調べるプロファイルを作成する必要があります。また、処理中に何かを失っていないことを確認するために、固定小数点に移植する際の比較を提供するために浮動小数点演算を実行する必要があります。
あなたのためにこれを行うライブラリがいくつかあります。あなたのデバイス用のPSPには、数種類の数学ライブラリが含まれているはずです。それは文書化されるべきです。 PSPで提供されているAPIを使用すると、プリミティブベースの浮動小数点演算を行う際に使用するコントロール構造が意味をなさないことがあるため、コードを書き直す必要があります。
例えば - Cのコードがまばらに、そしてあなたが浮動小数点エミュレーションライブラリを使用することができるかもしれない非常にまれ/ダブルスを使用しない場合は、この
double arraysum = 0.0;
for (int i = 0; i < arraylen; i++)
{
arraysum += array[i];
}
この
psp_decimal_t arraysum;
if (0 != psp_sum_elements(&array, arraylen, &arraysum))
{
printf("error!");
}
リンクが壊れています。正しいものを入力してください。 – Danijel
悲しいことに、私はどこにいてもそのコンテンツを見つけることができず、投稿した個人も見つけられませんでした。 –
に変換するかもしれませんあなたのCコードが10Xから100Xまで遅く実行されることはありません。パフォーマンスが低下したくない浮動小数点演算が多く、現実的な入力ごとに算術演算とストア演算で必要なスケールと精度が分かっている場合は、各算術演算を手動でスケーリングされた整数データ型と操作を使用しました。しかし、一般に、精度の要件を分析することは、DSP型コードにとっては重要ではありません。多くのDSPと数値メソッドの教科書の章があります。
...最後の文を精巧にしてください。これが参考になるためです。 – jpinto3912
次のコードは、整数を内部表現として使用する固定型を定義しています。加算と減算は、+
と-
の演算子で簡単に実行されます。乗算は定義されたMULT
マクロを使用して実行されます。
#include <stdio.h>
typedef int Fixed;
#define FRACT_BITS 16
#define FRACT_BITS_D2 8
#define FIXED_ONE (1 << FRACT_BITS)
#define INT2FIXED(x) ((x) << FRACT_BITS)
#define FLOAT2FIXED(x) ((int)((x) * (1 << FRACT_BITS)))
#define FIXED2INT(x) ((x) >> FRACT_BITS)
#define FIXED2DOUBLE(x) (((double)(x))/(1 << FRACT_BITS))
#define MULT(x, y) (((x) >> FRACT_BITS_D2) * ((y)>> FRACT_BITS_D2))
私の画像処理アルゴリズムでは、上記のコードを使用して分数を表していました。ダブルスを使用していたバージョンよりも速く、結果はほぼ同じでした。
このライブラリもチェックしてください:[http://www.sf.net/projects/fixedptc](http://www.sf.net/projects/fixedptc) –
- 1. バイナリ固定小数点のbyte []を浮動小数点値に変換する
- 2. C++がPythonに浮動小数点浮動小数点を変換する
- 3. 浮動小数点数は浮動小数点数ですか?
- 4. 固定小数点から浮動小数点へ
- 5. Cで分数を浮動小数点に変換する
- 6. 浮動小数点型の浮動小数点数を使用している浮動小数点数は、浮動小数点数の上位16桁です。
- 7. 浮動小数点をビットに変換
- 8. VHDL:浮動小数点から固定小数点の説明に変換しますか?
- 9. SSE:短い整数を浮動小数点に変換する
- 10. C/C++の固定幅浮動小数点数
- 11. 浮動小数点数浮動小数点数値
- 12. 指数関数を浮動小数点に変換する
- 13. Golangの整数を浮動小数点数に変換する
- 14. カンマで数字を浮動小数点に変換する
- 15. Elispで整数を浮動小数点に変換する
- 16. NSNumberを浮動小数点に変換するにはどうすればよいですか?
- 17. Cの浮動小数点
- 18. 浮動小数点浮動小数点浮動小数点浮動小数点数 - 浮動小数点数を持つ2つの要素:左に動くようにdivを配置する右のスタイル
- 19. 浮動小数点例外Cコード
- 20. iPhone用コンパイルの最適化:浮動小数点または固定小数点?
- 21. 未設定の浮動小数点と値が0の浮動小数点を区別するにはどうすればよいですか?
- 22. 小数点と小数点の両方をサポートする浮動小数点変換の文字列
- 23. 浮動小数点要素を浮動小数点要素にする
- 24. スペースがないときに浮動小数点数を強制的にリサイズするのではなく、浮動小数点数を浮動小数点以下の表の下に移動するにはどうすればよいですか?
- 25. 浮動小数点数をNSNumberに変換する
- 26. 文字列を浮動小数点数に変換する
- 27. wavを浮動小数点型配列バッファに変換するにはどうすればいいですか?
- 28. C++浮動小数点の固定小数点精度を設定する方法
- 29. IE7浮動小数点浮動小数点問題
- 30. jQuery animateNumber - 浮動小数点浮動小数点の方法
これはかなり大きなトピックです。このSOの質問には素晴らしい議論があります:http://stackoverflow.com/questions/79677/whats-the-best-way-to-do-fixed-point-mathちょうどすべての答えにいくつかの役に立つナゲットがありました。 – mtrw
DSPのコンパイラはどのように固定小数点を表していますか? 2つの整数として?たとえば、2つの固定小数点数を一緒に追加する方法はありますか? – chrisaycock
これらは32ビットの値( 'long')で表され、型に暗黙のシフトがあります。たとえば、ポイント( '_iq16')の後に16ビットがある場合、固定小数点数1.0を基になる型の整数65536で表します。同じタイプの固定小数点数を加算したり減算したりするには、標準の整数演算を使用できます。乗算にはスケーリングを修正するために余分なシフトが必要です。 – starblue