6

ifort と gfortran の両方で機能する、論理型変数を実数型に変換する防弾方法を探しています。次は ifort では機能しますが、gfortran では機能しません。

logical :: a
real :: b
a = .true.
b = dble(a)

gfortranでスローされるエラーは

b = dble(a)
         1
Error: 'a' argument of 'dble' intrinsic at (1) must be a numeric type

明らかに、.true. 1.d0 および .false にマップする必要があります。0.d0 に。これを行う最善の方法は何ですか?

4

4 に答える 4

12

これを処理する関数を作成することに加えて、組み込みのマージ関数を直接使用することもできますb = merge(1.d0, 0.d0, a)。または、これを行う定義済みの割り当てサブルーチンを作成して、と入力することもできますb = a

于 2013-02-24T23:15:15.930 に答える
7

これを行う固有のツールがあるかどうかはわかりません。なぜifortがこれを受け入れるのかはわかりませんが、コンパイラ固有の機能だと思います。

編集:以下のhttps://stackoverflow.com/a/15057846/1624033で指摘されているように、ここで必要なのはまさに固有のマージ関数です。

これに対するオプションは、特にこれを防弾にしたいので、独自の関数を作成することです。

私はこれをテストしていませんが、以下が機能する可能性があります。

elemental pure double precision function logic2dbl(a)
  logical, intent(in) :: a

  if (a) then
    logic2dbl = 1.d0
  else
    logic2dbl = 0.d0
  end if
end function logic2dbl

編集:以下のアドバイスに基づいて、関数宣言にelementalを追加しました。また、この関数に純粋なものを追加しました。これは、これを並列の状況で使用するための追加機能を追加し、優れたドキュメントであるためです。ただし、これは私の意見であり、必須ではありません。

于 2013-02-24T22:40:50.637 に答える
0

gfortran では、そのタイプのジョブに TRANSFER 組み込み関数を使用しています。整数変数 my_int を想定すると、次のようになります。

    my_int = transfer(.false.,my_int)

my_int の結果は予想どおり 0 です。

于 2015-04-01T20:34:03.397 に答える