私はLinuxカーネルモジュールを開発しました。浮動小数点定数を使用する必要があります。私は最近、カーネルモジュールの浮動小数点レジスタの使用を無効にするために必要な、カーネルビルドに遭遇しました。浮動小数点定数を使用しない浮動小数点定数(Linuxカーネルモジュール)
私浮動小数点演算の全体は時間をコンパイルすることができ、私が最後に必要なのは、特定の浮動のメモリ内のバイナリ等価あるヒープに変数を持つことです(変数の宣言された型は無関係です)。たとえば、
const float fval = 3.8 * 0.98/1000.0;
const int * const iptr = (const int *)&fval;
const int ival = *iptr;
私は達成しようとしていることをうまくはっきりと説明します。基本的には、コンパイル時にこれらのステップを実行して、ヒープ上に変数ivalを持つようにする必要がありますが、コンパイルされたコードに浮動小数点レジスタを使用する必要はありません。
これまでの私のハック解決策は、表現する必要のあるさまざまな浮動小数点定数値に対して上記のコードを実行してから、その整数表現を自分のモジュールコードに手動で転記することでした。
より明確に表現されています(実際には、ある意味で浮動小数点を使用する必要があります...コンパイルされたモジュールで浮動小数点レジスタを使用する必要はありません)。
float val = 3.1415926;
をそして、それは次のようにメモリに格納されるだろうとします:私は持っていると仮定し
が浮動でコンパイルすることなく、0xDA0F4940と、ヒープ上のメモリ領域を埋めるために、コンパイラを取得する方法はあります0xDA0F4940ポイント操作ですか?
一般的なガイドラインとして:カーネルコードに浮動小数点を使用しないでください。 FPを使って行うことはできませんが、FPなしでは実行できません。 –
プリプロセッサは浮動小数点では機能しません。しかし、あなたの投稿されたCコードは、0以上の最適化レベル> 0で必要なフォームに最適化する必要があります(レジスタや操作なし、初期化された変数のみ)。それを試して、生成されたアセンブリを見てください。 –
XY問題。浮動小数点なしで一緒に行くための簡単で明白な方法があります。一般的な数学を適用する。そのコードは未定義の動作を呼び出します。また、ヒープには何も割り当てられていません。 – Olaf