演算順序の変更による最適化

/assume:noaccuracy_sensitive オプションを使用すると,Compaq Visual Fortran は性能を向上させるためにコードの順序を (論理代数学上の同一性規則に基づいて) 変更することがあります。たとえば,次に示す 2 つの式は,数学的には等価ですが,有限精度計算を使用したときには同じ値にならない可能性があります。

	X = (A + B) + C

	X = A + (B + C)

このオプションを指定したときの結果は,中間結果の丸め方の違いのために,基本設定の /assume:accuracy_sensitive とはいくぶん異なることがあります。ただし,/assume:noaccuracy_sensitive を使ったときの結果は,すべて基本オプションを使ったときの結果よりも精度が低いというわけではありません。実際,内積などの演算では,/assume:noaccuracy_sensitive を使った方が,/assume:accuracy_sensitive を使ったときよりも精度の高い結果を生成することがあります。

/assume:noaccuracy_sensitive の効果は,Compaq Fortran が除算演算をループから押し上げるときに重要となります。/assume:noaccuracy_sensitive が有効になっていると,最適化されていないループは最適化されたループになります。

	最適化されていないコード		最適化されたコード

	DO I=1,N			T= 1/V
	  .				DO I=1,N
	  .				  .
	  .				  .
	  B(I)= A(I)/V			  .
	END DO				  B(I)= A(I)*T
					END DO

最適化されたループ中での変換は性能を大幅に向上させ,精度がほとんどまたはまったく失われません。ただし,オーバーフローまたはアンダーフロー算術例外を発生させる可能性はあります。