2013-04-09 9 views
9

私はコプロセッサをメインプロセッサに接続しています。一部の浮動小数点計算はコプロセッサで行う必要がありますが、ハードウェア浮動小数点命令をサポートしていないため、エミュレーションが遅すぎます。整数で浮動小数点計算を行う方法

浮動小数点値を整数として表現し、コプロセッサーに送信し、計算を実行し、戻ったときにそれらの値をスケールバックできるように、メインプロセッサーに浮動小数点値をスケーリングする方法があります。しかし、その数値は最終的にはその整数の範囲外になるには大きすぎたり小さすぎたりするため、ほとんどの場合は機能しません。だから私の質問は、これを適切に行う最速の方法は何か。

+1

浮動小数点演算の仕組みを学びます。それは簡単です。あなたは学校で必要な情報のほとんどを得ているはずです。残りはオンラインで見つけることができます(Wikipedia、Googleなどを使用してください)。浮動小数点演算ルーチンを実装します。 –

+0

しかしそれは遅い方法です。私は何かを効率的にしたい。 – MetallicPriest

+0

@AlexeyFrunze OPはすでにエミュレーションが遅すぎると言っています。これは浮動小数点の実装の問題ではありません。 – sfstewman

答えて

13

エミュレーションが遅すぎると言っています。私は浮動小数点のエミュレーションを意味すると思います。スケーリングされた整数では不十分な場合は唯一の代替案がありますが、固定小数点演算ですが、エミュレートされたfloatよりもはるかに高速ですが、正確には高速ではありません。

また、スケーリングされた整数とfixed point mathの両方で、浮動小数点よりもdynamic rangeが少なくなるという事実は、決してエスケープしません。

ただし、範囲が事前にわかっている場合は、必要な範囲で固定小数点数の実装を調整できます。

Here is定点上の記事です。このトリックの要点は、変数を分割する方法、数値の低い部分と高い部分のビット数を決めることです。

Cの固定小数点の完全な実装はfound hereです。 (BSDライセンス)そこにare others

+1

つまり、このような最適化は、ケースバイケースで行う必要があります。銀色の弾丸はありません。 –

+0

@AlexeyFrunze、確かに。 OPケースはかなり特別なようです。 –

+0

*ほとんど* +1。与えられたリンクはすべて純粋な 'C'であり、1つはJavaです。私はマルチワード算術のためにGnuPGPが好きです。 *インライン*アセンブラは、利用可能な場合に、より高速なマルチワード操作を得るために使用されます。私は*固定小数点* 'C'ライブラリもこれから恩恵を受けることができると思います。固定小数点のダイナミックレンジ*はそれほど大きくはありませんが、それはまた、[土地の心](http://www.altdevblogaday.com/2012/02/22/comparing-floating-point-numbers-2012-edition/)特に*埋め込み*タグが指定されています。 –

3

@Amigableクラークカントの提案に加えては、Anthony Williams' fixed point math libraryfloatまたはdoubleとほぼ同義的に使用することができますC++ fixedクラスを提供し、ARM上でソフトウェア浮動小数点以上5倍の性能向上を提供します。これには、CORDICアルゴリズムを使用して、トリグやログ関数などを含む標準数学ライブラリの完全バージョンfixedポイントバージョンが含まれています。

+0

同じ種類の別のプロジェクトは、[google hosted project](http://code.google.com/p/fpmath/)と[code project link](http://www.codeproject.com/Articles/37636)です。/Fixed-Point-Class)、これらはいくつかの超越関数を含む完全なライブラリの多くを持っているようです。 –

関連する問題