26

Fortran 90/95 で Infinite 値と NaN 値をチェックする標準に準拠した方法を見つけようとしましたが、思ったより難しいことがわかりました。

  • IEEE 754 で説明されているバイナリ表現を使用して Inf および NaN 変数を手動で作成しようとしましたが、そのような機能は見つかりませんでした。
  • ieee_arithmeticFortran 2003 の組み込みモジュールieee_is_nan()と組み込み関数を認識していieee_is_finite()ます。ただし、すべてのコンパイラ (特にバージョン 4.9 のgfortran ) でサポートされているわけではありません。

最初に無限大と NaN を定義するのはハックのようでpinf = 1. / 0nan = 0. / 0IMHO はいくつかの構築上の問題を引き起こす可能性があります。たとえば、一部のコンパイラがコンパイル時にこれをチェックする場合、特別なフラグを提供する必要があります。

標準の Fortran 90/95 で実装できる方法はありますか?

function isinf(x)
! Returns .true. if x is infinity, .false. otherwise
...
end function isinf

そしてisnan()

4

8 に答える 8

30

を使用しない簡単な方法ieee_arithmaticは次のとおりです。

Infinity : 変数infinity = HUGE(dbl_prec_var)(または、ある場合は 4 倍精度変数) を定義します。次に、変数が無限大かどうかを簡単に確認できますif(my_var > infinity)

NAN : これはさらに簡単です。定義上、NAN は何にも等しいわけではありません。変数をそれ自体と比較するだけですif(my_var /= my_var)

于 2013-06-30T14:50:34.447 に答える
4

コメントするのに十分な担当者がいないので、無限をテストするための Rick Thompson の提案に関して「回答」します。

if (A-1 .eq. A) 

これは、A が非常に大きな浮動小数点数で、1A の精度を下回る 場合にも当てはまります。

簡単なテスト:

subroutine test_inf_1(A)
    real, intent(in) :: A
    print*, "Test (A-1 == A)"
    if (A-1 .eq. A) then
        print*, "    INFINITY!!!"
    else
        print*, "    NOT infinite"
    endif
end subroutine

subroutine test_inf_2(A)
    real, intent(in) :: A
    print*, "Test (A > HUGE(A))"
    if (A > HUGE(A)) then
        print*, "    INFINITY!!!"
    else
        print*, "    NOT infinite"
    endif
end subroutine


program test
    real :: A,B

    A=10
    print*, "A = ",A
    call test_inf_1(A)
    call test_inf_2(A)
    print*, ""

    A=1e20
    print*, "A = ",A
    call test_inf_1(A)
    call test_inf_2(A)
    print*, ""

    B=0.0 ! B is necessary to trick gfortran into compiling this
    A=1/B
    print*, "A = ",A
    call test_inf_1(A)
    call test_inf_2(A)
    print*, ""

end program test

出力:

A =    10.0000000    
Test (A-1 == A)
    NOT infinite
Test (A > HUGE(A))
    NOT infinite

A =    1.00000002E+20
Test (A-1 == A)
    INFINITY!!!
Test (A > HUGE(A))
    NOT infinite

A =          Infinity
Test (A-1 == A)
    INFINITY!!!
Test (A > HUGE(A))
    INFINITY!!!
于 2014-12-31T16:55:34.480 に答える
2

いいえ。

NaN を生成/チェックするための IEEE_ARITHMETIC の重要な部分は、特定のアーキテクチャの gfortran 用に簡単に記述できます。

于 2013-06-30T11:47:34.750 に答える
0

いいえ。

Fortran 90/95 には、無限大または NaN をチェックする標準に準拠した方法はなく、標準に準拠した方法も存在しません。Fortran 90/95 では、これらの準数のいずれかを定義する標準に準拠した方法はありません。

于 2013-06-30T15:43:20.157 に答える
-2

Inf の場合、(A-1 .eq. A) が true の場合、A は Inf であることが機能しているようです

于 2014-11-12T15:35:23.523 に答える