単精度表現の範囲外にある (結果型の範囲外にあるだけではない) 浮動小数点値の計算を行う最適化済みプログラムの場合、-qfloat=hsflt オプションはアンセーフです。 この表現範囲には精度と指数範囲が含まれます。
前の段落および -qfloat オプションで述べた規則に従っていても、 精度の違いに依存しているプログラムでは、予想した結果を生成しない場合があります。 -qfloat=hsflt は IEEE に準拠していないため、プログラムが常に予想どおりに稼働するとは限りません。
たとえば以下のプログラムでは、X.EQ.Y は真である場合と偽である場合があります。
REAL X, Y, A(2) DOUBLE PRECISION Z LOGICAL SAME READ *, Z X = Z Y = Z IF (X.EQ.Y) SAME = .TRUE. ! ... ! ... Calculations that do not change X or Y ! ... CALL SUB(X) ! X is stored in memory with truncated fraction. IF (X.EQ.Y) THEN ! Result might be different than before. ... A(1) = Z X = Z A(2) = 1. ! A(1) is stored in memory with truncated fraction. IF (A(1).EQ.X) THEN ! Result might be different than expected. ...
Z の値に単精度変数の精度外にある小数ビットがある場合、そのビットは保存される場合と、失われる
場合があります。
このため、倍精度値の Z が単精度変数に割り当てられる場合に正確な結果は予期不能となります。
たとえば、変数を仮引き数として渡す場合、メモリーに記憶される値の小数部は丸められるのではなく切り捨てられます。