4

次のような 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
4

2 に答える 2

1

アンダーフローを回避するためだけの場合hypotは、斜辺の二乗を使用したいですか、それとも本当に必要ですか?

の実装では、 のhypotオーバーフロー/アンダーフローの問題を回避する必要がありsqrt(x**2+y**2)ます。

于 2017-04-12T08:32:26.300 に答える