Tuesday, August 3, 2010

Fortran9xとC++の違い

Fortran9x(以下単純にFortran)とC++の違いについて、知っているものから順に箇条書きにしていこうと思う。

慣れれば気にならなくなる違い
  • パラメータの宣言:例えば、「a=0.5」というパラメータaを定義したい場合、Fortranでは宣言部で
    real, parameter :: a = 0.5
    と書けばよい。一方、C++ではプログラムの始めに
    #define a 0.5
    と書く方法がある。ただ、この場合aのデータ型が(普通に宣言したときのデフォルトの)倍精度実数なのか、そもそもデータ型がないのかがよくわからん。

  • 倍精度実数の宣言:
    Fortranでは"9.9D0"のように実数9.9を倍精度実数として認識させるのに"D0"をつける必要があるのに対し、C++では"9.9"とすれば倍精度実数として認識される。デフォルト設定について、Fortranが単精度実数になっているのに対して、C++は倍精度実数になっている。

  • 多次元配列のメモリ上の記録位置:
    Fortranでは
    integer, dimension(2,2) :: M
    で宣言された配列Mの各要素のメモリ上の配置は、M(1,1)→M(2,1)→M(1,2)→M(2,2)と、左側のindexを優先して並べられる。この場合、ループを書く場合は左側のindexほどループの中に書く必要がある。C++はこれとはまったく逆。右側のindexを優先してメモリ上に記録される。したがって、速いループを書くには、左側のindexほどループの外側に書く必要がある。

  • 変数の値の入れ換え:
    メインプログラムにある変数xとy(ここでは整数とする)の値を入れ換えるのに外部手続き(Fortranではサブルーチン、C++では関数)を使いたいと仮定する。このとき、Fortranでは
    subroutine exhange(x,y)
    integer, intent(inout) :: x, y
    integer z
    z = y
    y = x
    x = z

    end subroutine
    と書いて"intent"を使えばOK。一方、C++はポインタかエイリアスを使う必要がある。
    • (注)このポインタやエイリアスを使うことによって最適化が不十分になってしまうという問題点があるらしい。この点で計算速度がFortranに比べて劣るか。

  • 配列の添え字:Fortranでは配列の添え字が1から始まるが、C++では0から始まる。

  • 1次元配列(ベクトル)の書き方:1次元配列をベクトルと捉えて、例えば、v=[1,2,3]を配列vを使って定義する場合、Fortranでは
    v=(/1, 2, 3/)
    であるが、C++では
    v={1, 2, 3}
    と書く。

  • 行列(2次元配列)の初期化:
    M = [ 1, 2 ]
       [ 3, 4 ]
    という行列を2次元配列Mで定義するとき、C++は
    int M[2][2] = {1, 2, 3, 4};
    とすればよいが、Fortranでは
    integer, dimension(2,2) :: M = reshape( (/1, 3, 2, 4/), (/2, 2/) )
    とする。いずれもメモリ上に記録されている順に数値が代入されていく。


C++の面倒くさい部分
  • 累乗:
    Fortranでは「xのa乗」は"x**a"と書けばいいが、C++は累乗の演算子がなく、面倒らしい。


C++の、便利そうだが実はそうでもなさそうな機能
  • 変数の宣言位置:Fortranでは変数の宣言はすべてプログラム冒頭(なんて言ったっけ?)で宣言する必要があるが、C++は変数を使う部分より前であればどこでもOK。
    • 後で参照しやすくするため、一ヶ所でまとめて宣言する方が良いに決まってる。

No comments:

Post a Comment