● 特殊な数学型のクラス

計算物理のプログラムでは複素数やベクトルなど、C言語には用意されて いない型の演算が必要になることが多い。 C++では演算子の多重定義が可能になったので、例えば + の 演算子のComplex型に対する機能を「成分ごとの足し算」とプログラマが 設計することができる。これにより、
  Complex a, b, c;
  c = a + b;
と物理の数式通りに記述することが可能になる。 複素数やベクトルの演算が自然に行えるようにあらゆる演算子を定義すると 大変便利である。しかしこれには、実行効率の大幅な低下という物理計算に とっては致命的な罠が潜んでいる。 この罠をある程度克服した複素数、ベクトルの定義付きヘッダーファイルを 本書では提供する。これらを利用するには単に #include "" すれば 良い。コンパイルの際には最適化optionを付けること。 コンパイラによってはwarningが大量に発せられるが無視して構わない。
gcc -o main -O4 main.cc

■ 複素数クラス

本書付属の complex.h 内で定義される 複素数クラス Complex は、propertyにdouble型の real と imag の2成分をもち 多くの演算子の多重定義と関数を持つ。以下に演算の種類の一覧を載せる。

代入演算子(単純、複合)

Complex =  Complex
Complex += Complex
Complex -= Complex
Complex *= double
Complex *= Complex
Complex /= double
Complex /= Complex

算術演算子(単項、2項)

        - Complex
        + Complex
Complex + Complex
Complex - Complex
Complex * double
double  * Complex
Complex * Complex
Complex / double
double  / Complex
Complex / Complex

関数

    // return complex conjugate
Complex conj( Complex& )
    // return absolute value
double  abs( Complex& )
    // return square of absolute value
double  abs2( Complex& )
    // return argument value
double  arg( Complex& )
    // return complex exponential
Complex exp( Complex& )

■ 2次元ベクトルクラス

Complex クラスと同様に2次元のベクトルクラス Vector2 も 提供する。本書付属の vector2.h 内で定義される Vector2 クラスはpropertyにdouble型の x と y の2成分をもち、 多くの演算子の多重定義とmethodと関数を持つ。

代入演算子(単純、複合)

Vector2 =  Vector2
Vector2 += Vector2
Vector2 -= Vector2
Vector2 *= double
Vector2 /= double

算術演算子(単項、2項)

        - Vector2
        + Vector2
Vector2 + Vector2
Vector2 - Vector2
Vector2 * double
Vector2 / double
double  * Vector2
Vector2 * Vector2 //内積
Vector2 % Vector2 //外積
Vector2 % double  //外積

method

    // turn this vector by given angle
Vector2::turn( double )

関数

    // return absolute value
double  abs( Vector2& )
    // return square of absolute value
double  abs2( Vector2& )
ただし外積は2次元では本来定義されない演算であるが、 Vector2 % Vector2 では外積の結果のベクトルの z 成分を 返し、 Vector2 % double では double を z 軸に平行で z 成分がそれであるベクトルとして外積を計算して返す。

■ 3次元ベクトルクラス

3次元ベクトルクラス Vector3 も提供する。 本書付属の vector3.h 内で定義される。 2次元と異なる所は外積が普通に定義されることだけである。

  • 次へ
  • 目次
    Copyright(C) by Naoki Watanabe. Oct 21st, 1995.
    渡辺尚貴 naoki@cms.phys.s.u-tokyo.ac.jp