Intel Pentium の浮動小数点の欠陥 (ia32 のみ)

一部のバージョンの Intel Pentium 586 プロセッサーは,稀な浮動小数点除算演算で誤動作を起こす欠陥を持っています。この誤動作は,浮動小数点の TANATAN,および MOD 演算でも起こることがあります。この問題を引き起こす入力の種類はきわめて少なく,その際の結果の誤差もやはりきわめて小さいので,この欠陥のために問題が生じる可能性はほとんどありません。きわめて小さい誤差が,90 億回の演算に 1 回しか起こらない程度だと推定されています。

欠陥を含んでいる Pentium チップの検査を要求するには,次に示すような Pentium の欠陥が表面化する可能性があると思われるコードで,基本コンパイラ・オプション /check:flawed_pentium を使用します。このコンパイラ・オプションは,実行時ルーチン FOR_CHECK_FLAWED_PENTIUM の実行時の呼び出しを生成します。基本オプション /check:flawed_pentium は,この条件では実行時のエラー・メッセージを発行し,プログラムの実行を停止します。この条件が発生してもプログラムの実行を続けさせるためには,環境変数 FOR_RUN_FLAWED_PENTIUM を真に設定し,プログラムを再実行してください (「実行時の環境変数」を参照)。

Visual Fortran には,Pentium の欠陥に対するソフトウェアによる回避策は含まれておらず,これらの演算は欠陥を含んでいる Pentium プロセッサーでは誤った結果を生成する可能性があります。

使用している Pentium に欠陥があるかどうかを調べるには,/check:flawed_pentium コンパイラ・オプションを指定して,次のプログラムを実行してください。

	PROGRAM go
	REAL(8) op1, op2
	COMMON /divide_check/ op1, op2
	DATA op1 /3145727.0/, op2 /4195835.0/
	IF( op2/op1 > 1.3338 ) THEN
	  PRINT *,'This computer always divides correctly.'
	ELSE
	  PRINT *,'This computer can have divide problems.'
	ENDIF
	END

このプログラムを何のコンパイラ・オプションも付けずにコンパイルして実行すると (基本オプションは /check:flawed_pentium です),欠陥を含んでいる Pentium システムで実行した場合,実行時のエラーが発生します。

オペレーティング・システムには,浮動小数点演算のソフトウェア・エミュレーションを使うことで,欠陥を含んでいる Pentium プロセッサーの問題を回避する方法が用意されています。詳細については,オペレーティング・システムのマニュアルを参照してください。オペレーティング・システムがソフトウェア・エミュレーションを使用するように構成されている場合は,Visual Fortran のすべての浮動小数点演算が,上のプログラムも含めてつねに正しく動作します。ただし,オペレーティング・システムによる欠陥の回避は,性能に大きな犠牲を伴う可能性があること,またそのプログラムを別のマシンで実行する場合,そのマシンのオペレーティング・システムが同じソフトウェア・エミュレーションを使用するように構成されていないと,動作が異常になることに注意してください。

欠陥を含んだ Pentium の浮動小数点の問題に左右されるソフトウェアを配布する場合,アプリケーションの起動時にプロセッサーを検査して,欠陥プロセッサーを搭載しているシステムではプログラムを停止させることをお勧めします。このためには,上記のプログラムを単純なサブルーチンに書き換え,アプリケーションの起動時にそのサブルーチンを呼び出し,欠陥を含んだ Pentium プロセッサーが検出された場合,実行を始める前に STOP 文を使ってアプリケーションを停止してください。ソフトウェアを配布するときには,/check:flawed_pentium コンパイラ・オプションを指定してコンパイルするようにしてください。

Visual Fortran に付属するすべての実行時ライブラリーは,Pentium の除算と MOD の問題に関して安全なようにコンパイルされています。

Intel Pentium の欠陥の詳細について,または Pentium プロセッサーの交換を要求する方法については,Intel にお問い合わせください (米国では 1-800-628-8686)。