4

まあ、これは最適化の問題ではありません。

私は(今のところ)いくつかの位置の平均を見つける必要がある単純なLinuxカーネルモジュールを書いています。これらの位置は、浮動小数点(つまりfloat)変数として格納されます。(私はすべての作者なので、それを変更することはできますが、フロートの精度を維持し、回避できる場合はそれに関与しないようにします)。

現在、これらの位置の値は、単に保存するためにカーネルに保存されます(または少なくとも使用されます)。1つのユーザーアプリケーションがこれらのデータを書き込み(共有メモリを介して(私はRTAIを使用しているので、カーネルとユーザースペース間で共有メモリを使用しています))、他のアプリケーションはそこから読み取ります。float変数からの読み取りと書き込みはFPUを使用しないので、これは安全だと思います。

安全とは、カーネルでFPUを回避することを意味します。言うまでもなく、一部のシステムにはFPUさえありません。kernel_fpu_begin / endを使用するつもりはありません。これは、タスクのリアルタイム性を損なう可能性があるためです。

カーネルモジュールでは、(位置はとにかく平均化されているので)実際にはそれほど精度は必要ありませんが、0.001までは必要です。私の質問は、FPUを使用せずに、浮動小数点数を整数(元の数の1000倍)に移植可能に変換するにはどうすればよいですか?

フロートのビットパターンから手動で数値を抽出することを考えましたが、エンディアンがどのように影響するかわからないため、またはすべてのアーキテクチャのフローティングポイントが標準である場合でも、それが良いアイデアかどうかはわかりません。

4

4 に答える 4

5

gccにソフトウェア浮動小数点ライブラリを使用するように指示したい場合は、標準環境ではターンキーではないかもしれませんが、明らかにそのためのスイッチがあります。

x86Linuxでソフトウェア浮動小数点を使用する

実際、この記事は、Linuxカーネルとそのモジュールがすでに-msoft-float:でコンパイルされていることを示唆しています。

http://www.linuxsmiths.com/blog/?p=253

そうは言っても、@PaulRの提案は最も賢明なようです。そして、あなたが好きな変換を行うAPIを提供しているなら、それが他の何よりも醜い理由がわかりません。

于 2012-04-18T16:02:44.850 に答える
5

SoftFloatソフトウェアパッケージには、必要なことを正確に実行する機能があります(float32_to_int32ソフトウェアにIEEE 754を実装します)。

結局、カーネル(ハードウェアであれソフトウェアであれ)にある種の浮動小数点サポートがあると便利なので、これをプロジェクトに含めるのはおそらく賢明な決断でしょう。大きすぎないです。

于 2012-04-18T16:07:32.563 に答える
2

実際、可能であれば、モジュールのAPIを変更して、すでに整数形式のデータを使用する必要があると思います。カーネル空間で浮動小数点を使用することが許可されていない場合、カーネルユーザーインターフェイスに浮動小数点型を含めることはお勧めできません。

とはいえ、単精度浮動小数点数を使用している場合、基本的には常にIEEE 754単精度になり、エンディアンは整数のエンディアンと一致する必要があります。私の知る限り、これはLinuxがサポートするすべてのアーチに当てはまります。そのことを念頭に置いて、それらを符号なし32ビット整数として扱い、ビットを抽出してスケーリングします。可能であれば、1000ではなく1024でスケーリングします。それを行うのは本当に簡単です。仮数ビット(ビット0〜22)、ビット23の「または」から始めて、指数(127のバイアスを引いた後)が23未満の場合は右シフトし、23より大きい場合は左シフトします。右シフト量が32を超える場合を処理する必要があります(Cでは許可されません。

もちろん、値が特定の範囲を超えないことがわかっている場合は、これらのチェックの一部を削除できる可能性があります。実際、値が1を超えることはなく、スケーリングを選択できる場合は、2 ^ 23に選択して((float_bits & 0x7fffff)|0x800000)、指数がゼロのときに値として直接使用するか、右シフトすることができます。

于 2012-04-18T18:17:23.310 に答える
0

浮動小数点数の代わりに有理数を使用できます。演算(乗算、加算)も精度を損なうことなく実装できます。

本当に1/1000の精度しか必要ない場合は、x*1000を長整数として格納できます。

于 2012-04-18T16:07:59.760 に答える