多数桁計算用部品プログラム
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のステップ単位計算ルーチン
ソースプログラムはFORTRAN |
とC | を掲載する。
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のべき乗を求める
ソースプログラムはFORTRAN |
とC | を掲載する。
4. 時間計測プログラム
ソースプログラムはFORTRAN |
を掲載する。
Cはシステム提供関数(clock)を使用しているので不要。