次のような Fortran コードをコンパイルするときに、アンダーフロー エラーを発生させずに、float (または double) の数値を乗算または 2 乗する適切な方法があるかどうかを知りたいです。
gfortran -ffpe-trap=invalid,zero,overflow,underflow ...
underflow
このオプションが必ずしも良いアイデアではないことはわかっていますが、このオプションで乗算を実行できるかどうか疑問に思っています。実際、次の例では、アンダーフローが発生する可能性があることはわかっていますが、コード内の他のケースを認識していない可能性があります。これが、可能であれば、このオプションを維持したい理由です。
これは、行列のすべての x、y インデックスに対してベクトル u を計算する例です。これらのベクトルを構成する 2 つの値は 0 から 1 の間です。次に、そのノルムの 2 乗を計算します。
非常に論理的で、この二乗演算のために値がアンダーフローします。これらの非常に小さな値は、私にとってゼロと見なすことができるためです。underflow
比較を使用するよりも良くない方法はありif
ますか?
implicit none
double :: u(100,100,2), uSqr(100,100)
integer :: x,y
DO x= 1, 100
DO y = 1, 100
CALL Poisin( u(x,y,:), x, y )
ENDDO
ENDDO
uSqr = u(:,:,1)*u(:,:,1) + u(:,:,2) * u(:,:,2) ! where comes the underflow errors