多数桁計算用部品プログラム

       2003/01/10 日立製作所 & 早稲田大学 後 保範 ( Ushiro Yasunori )

1. 概要

 多数桁の加減算、乗除算等の多数桁の基本演算のFORTRANとCのプログラムを示す。
本プログラムは内容を理解してもらうことを目的とし、計算時間及び使用メモリ量の効率化
は目的としていない。本格的なプログラムは金田研究室から他のプログラムと合わせて
公開する予定。 多数桁の乗算はFMT(高速剰余変換) を用いて作成している。
 多数桁の値はn個の倍精度実数で表わす固定小数点と、n+1個の倍精度実数で表わす
小数点の2形式がある。浮動小数点形式の最初の倍精度実数に指数部をもつ。
計算する値の基底は2進数でも10進数でも何でも良いが下記で最初に指定する。
 (1) FORTRANでの指定
    COMMON /VBASE/BASE,NORID
    BASE = 16.0**4  ! 1要素が16進4桁の例 (10進5桁だと、10.0**5)
    NORID = -1   ! 各要素は符号付きでBASE/2以下にする。計算に利用。
    NORID = 1   ! 各要素を正符号でBASE以下にする。出力用の変換に利用。
 (2) Cでの指定
   グローバル変数とし下記を指定する。10進5桁の例で示す。
    double BASE=1.0e5;
    int NORID=-1;
出力用の変換に利用するため、各要素を正符号にするには、下記を指定する。
    NORID=1;
 乗算、除算及び平方根の計算では引数ERRに実数から整数への変換時の最大誤差を返す。
ERRが0.1を超える場合はBASEに指定する桁数を1つ小さくすると良い。ERRが0.5に近い値
の場合は結果が保証されない。通常はBASEは10進5桁か16進4桁が適当である。

2. 多数桁乗除算プログラム

 多数桁の乗算はFMT(高速剰余変換) を用いて作成している。演算結果は全て正規化している。

2.1 計算方法

 (1) 乗算
   FMT応用 の「5. 複素FMTによる実数の畳込み演算」を利用する。
   本計算は(4)(a)のCFM4ルーチンで実現している。本計算の順変換をFMT、逆変換をFMT-1
   とするとC=A・Bの多数桁乗算は下記のように計算される。
     Cの上位桁 = FMT-1 ( FMT(A) × FMT(B) )の虚数部
     Cの上位桁 = FMT-1 ( FMT(A) × FMT(B) )の実数部
   ここで、×は対応する要素単位の乗算を示す。
 (2) 除算
   x = 1/Aの計算を下記の反復計算で求める。
     x = x + x・( 1 - A・x )
 (3) 平方根
   x = SQRT(1/A)の計算を下記の反復計算で求める。
     x = x + x・( 1 - A・x2 ) / 2

2.2 プログラム一覧

 (1) 乗算
  (a) FMTCFM : 浮動小数点の多数桁乗算 (C=A*B)
  (b) MTCFM  : 固定小数点の多数桁乗算 (C=A*B)
 (2) 除算
  (a) FINV   : 浮動小数点の多数桁逆数計算 (C=1/A)
  (b) FDIV   : 浮動小数点の多数桁除算 (C=A/B)
 (3) 平方根
  (a) FCSQRT : 浮動小数点の多数桁平方根 (入力は整数値)
  (b) FSQRT  : 浮動小数点の多数桁平方根 (C=SQRT(A) or 1/SQRT(A))
 (4) FMTルーチン
  (a) CFMT4  : 実数の畳込み演算用に変換した複素FFT
  (b) CFMT   : 複素FMT
  (c) CFMTTB : 複素FMT用計算テーブル作成
  (d) CFMTSB : 複素FMTのステップ単位計算ルーチン

 ソースプログラムはFORTRANCを掲載する。

3. 多数桁加減算、正規化等プログラム

 演算結果は全て正規化している。

3.1 多数桁の正規化の方法

 (1) 固定小数点の正規化
   1要素(倍精度浮動小数点)にE(BASEの値、105等)進数で与える。このとき、
   n要素の固定小数点の値fは下記のように表わされる。
     f = a1・En-1 + …… + an-1・E + an
   計算中(NOIRD=-1)の正規化とは上記係数akを符号付きで下記の範囲に収める。
     | ak | < E/2
   出力時の表示を考慮しNOIDR=1に設定して正規化すると係数akを下記にできる。
     0 < ak < E
   (2) 浮動小数点の正規化
   多数桁浮動小数点は先頭の要素(倍精度実数)が指数部で、その後にn要素の仮数部
   が続く構成である。指数部の値がαで仮数部がn要素の浮動小数点の値gは下記のよう
   に表わされる。
     g = Eα ・ ( a1・E-1 + …… + a1-n・E + an・E-n )
   浮動小数点の正規化は総ての係数akがゼロでない限り、先頭の係数 a1がゼロ以外の
   数値になるよう仮数部をシフトし、指数部のαの値を調整する。

3.2 プログラム一覧

 (1) 加減算
  (a) FADD   : 浮動小数点の多数桁加減算 (C=A+B or A-B)
  (b) ADD   : 固定小数点の多数桁加減算 (C=A+B or A-B)
  (c) FCADD  : 浮動小数点の定数と多数桁の加減算 (C=k+B or k-B)
 (2) 正規化
  (a) FNORM  : 浮動小数点の正規化(浮動小数点演算に利用している)
  (b) NORM  : 固定小数点の正規化(四則演算にに利用している)
 (3) 定数の乗除算
  (a) FCMT   : 多数桁と定数の乗算 (C=A*k)
  (b) FCDIV  : 固定小数点の正規化 (C=A/k)
 (4) その他
  (a) COPY   : データのコピー
  (b) SETV   : 全要素に一定値を設定
  (c) FVSET  : 定数を浮動小数点の多数桁の形式に変更
  (d) LOG2F  : 整数に対して2のべき乗を求める

 ソースプログラムはFORTRANCを掲載する。

4. 時間計測プログラム

 ソースプログラムはFORTRAN を掲載する。
 Cはシステム提供関数(clock)を使用しているので不要。