11

Fortran で変数を +Infinity に設定する最も安全な方法は何ですか? 現時点で私は使用しています:

program test
  implicit none
  print *,infinity()
contains
  real function infinity()
    implicit none
    real :: x
    x = huge(1.)
    infinity = x + x
  end function infinity
end program test

しかし、もっと良い方法があるかどうか疑問に思っていますか?

4

5 に答える 5

11

コンパイラがいわゆる Fortran 2003 標準の一部である ISO TR 15580 IEEE 演算をサポートしている場合は、ieee_* モジュールのプロシージャを使用できます。

PROGRAM main

  USE ieee_arithmetic

  IMPLICIT NONE

  REAL :: r

  IF (ieee_support_inf(r)) THEN
    r = ieee_value(r,  ieee_negative_inf)
  END IF

  PRINT *, r

END PROGRAM main
于 2011-02-16T06:15:01.837 に答える
1

私は、IEEE 標準をサポートするためにコンパイラーに依存せず、2 つの変更を加えることで、あなたが行ったこととほとんど同じことを行います。

  1. huge(1.)+huge(1.)一部のコンパイラでは--- になる可能性があり、これによりメモリリークが発生する可能性があるため、追加-huge(1.)+1しません (理由はわかりませんが、これは実験的な事実です)。

  2. ここでは型を使用してrealいます。個人的には、すべての浮動小数点数を として保持することを好みます。そのため、すべての浮動小数点定数は、次のようreal*8に で修飾されます。もちろん、これはルールではありません。-s と-sの両方を使用することを好む人もいます。d0huge(1.d0)realreal*8

于 2011-02-16T10:50:19.657 に答える
1

以下の解決策がすべてのコンパイラで機能するかどうかはわかりませんが、-log(0) として無限に到達する数学的な方法です。

program test
  implicit none
  print *,infinity()
contains
  real function infinity()
    implicit none
    real :: x
    x = 0
    infinity=-log(x)
  end function infinity
end program test

複雑な変数に対してもうまく機能します。

于 2014-09-23T13:35:12.760 に答える
0

最も安全な方法はわかりませんが、別の方法を提供できます。私はこのようにすることを学びました:

PROGRAM infinity
  IMPLICIT NONE
  INTEGER :: inf
  REAL :: infi
  EQUIVALENCE (inf,infi) !Stores two variable at the same address
  DATA inf/z'7f800000'/ !Hex for +Infinity
  WRITE(*,*)infi
END PROGRAM infinity

式で例外的な値を使用している場合 (これは一般的には推奨されないと思います)、コンパイラがそれらを処理する方法に注意を払う必要があります。そうしないと、予期しない結果が生じる可能性があります。

于 2011-02-16T00:42:16.970 に答える