1

x87 FPU 制御ワード、具体的には精度制御フィールドのデフォルト設定を決定するものは何ですか? コンパイラはターゲット プロセッサに基づいて設定しますか? それを変更するコンパイラオプションはありますか?

Intel Core Duo プロセッサで Microsoft Visual C++ 2008 Express Edition を使用する場合、精度制御フィールドのデフォルト設定は「01b」で、倍精度 (53 ビット) を意味します。私は疑問に思っています-なぜデフォルトが「11」bまたは拡張(64ビット)精度ではないのですか?

(_controlfp を使用して変更できることはわかっています。)

4

4 に答える 4

2

Microsoft C ランタイム DLL (MSVCRT.DLL) にバグがあり、FPCW が変更され、DLL のロード順序に応じてアプリケーションの動作が変わる可能性がありました。

そのため、FPCW の設定が気になる場合は、実行前に目的の設定に変更することをお勧めします (関数呼び出しの境界であっても) だけでなく、完了したら元に戻すこともお勧めします。(そして、関数やライブラリを呼び出す場合は、それを変更する可能性のある呼び出し先に注意してください。また、変更を元に戻そうとすることもありません!)

また、注意してください: FPCW は変更するのに費用がかかりますが、調査するのにそれほど費用はかかりません。したがって、すでに希望どおりに設定されている可能性が高い場合は、変更する前に確認することで時間を大幅に節約できます。

于 2011-03-11T13:52:53.380 に答える
0

理論的な観点から:おそらくそれを使用した最後のもの、またはそれを除けば、Intelが決定したものは何でも良いデフォルトになるでしょう。

実用的な観点からは、作業を開始する前に希望の精度に設定するだけです。通常、明示的なデフォルトは暗黙のデフォルトよりも優れています。

于 2010-03-31T15:09:39.983 に答える
0

同じ元の質問について疑問に思っていました。Windows 2000 (32 ビット) で VC++ 6 と MinGW を試しました。

単純な 3 行のプログラムでは、FPU 制御ワードが VC++ の「倍精度」(0x027f) に設定され、MinGW (0x037f) を使用してコンパイルされたときに「拡張精度」に設定されていました。同じマシンで、gcc/Linux-32 は同じ拡張精度 (0x37f) を持っていました。つまり、MinGW と gcc/Linux の FPU 設定は同じようです。

于 2013-03-22T01:42:12.700 に答える
0

OS がプロセス (またはスレッド) をセットアップするとき、たとえば、プログラムの起動時に、制御レジスタを既定の状態に初期化する責任があります (既定の状態が正確に何であるかは、プラットフォームによって多少異なります)。また、システム上で実行されている他のプロセスにプログラムが状態をブリードしないように、コンテキスト スイッチの前後で状態を保存および復元する役割もあります。

さらに、コンパイラまたは言語ランタイムは、コードが実行される前に状態を変更する可能性があります。

したがって、Windows のデフォルトの FP 状態は 53 ビット精度であるか、VS2008 はデフォルトでプロセッサを 53 ビット精度に設定するコードを挿入します。Windows の既定のプロセス状態は、プラットフォームの ABI ドキュメントに記載されている必要があります。

于 2011-02-18T19:14:46.940 に答える