整数の内部表現に関しては, ほとんどの機種で同一の表現となっているのに対して, 実数型に関してはいくつかの規格が存在する. このように実数表現形式の異なる計算機同志でデータを交換するための ユーティリティーが REALLIB である.
一般に,実数型の変数は浮動小数点の形で表現される. すなわち,β進法を使った場合,実数は ±(0. f_1 f_2 f_3 ... f_m)_β β^± E という形で表されている. ここで, ±(0. f_1 f_2 f_3 ... f_m) = ± (f_1 β^-1 + f_2 β^-2 + f_3 β^-3 + ... f_m β^-m) は,仮数部でf_iは0からβ-1までの整数,f_1 ≠ 0 である. また,Eは指数部で0または正の整数である.
ほとんどのメインフレーム系の計算機で使用されている実数表現は IBM形式と呼ばれるものである. これに対して,UNIXなどのコンパイラでは IEEE(アイ・トリプル・イーと読む)規格を採用しているものが多い. どちらも,32ビットを1語とする点は同じであるが, 採用されている進法が異なり, 表現できる実数の範囲や精度に違いがある.
これは富士通,日立などのいわゆるIBMコンパチ汎用機で採用されている 16進法の浮動小数点形式である. これらの計算機はもともと事務処理などのデータ処理が便利なように 作られているため,16進演算が基本になっている. 各ビットの使い方は以下の通り.
{0.5mm |c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c| c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c| 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 & 15 & 16 & 17 & 18 & 19 & 20 & 21 & 22 & 23 & 24 & 25 & 26 & 27 & 28 & 29 & 30 & 31
± & E+64 & f_1 & f_2 & f_3 & f_4 & f_5 & f_6>
ここで,指数部は負にならないようにEに64を足した 「ゲタばき表現」で表され, Eは-64から63の値をとる. 仮数部は16進の6桁で,7桁目は.切.捨.てられる. 0は,この表示体系にはなじまない数値であるので, 別途,「全てのビットが0である数値」という定義がなされている.
この方法で表される0でない数値のうち絶対値最大のものは (1-16^-6) 16^63 = 7.237005 10^75 であり,絶対値最小のものは 16^-1 16^-64 = 5.397605 10^-79 である.
また, この方法で表される数値の相対誤差は f_1=f_2=... = f_6=15の時, 最も小さくて 約16^-6 6 10^-8 f_1=1, f_2= ... = f_6=0 の時, 最も大きくて 約16^-5 10^-6 である. このようにf_1の値が小さいと, その上位ビットが無駄になってしまうので精度が極端に悪くなる.
- IEEE形式
これはUNIXマシンなどで採用されている 2進法の浮動小数点形式である. 最近では,この形式を採用する計算機が多い. これは,IBM形式に比べて相対精度が高いという特徴がある. 各ビットの使い方は以下の通り.
{0.5mm |c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c| c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c| 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 & 15 & 16 & 17 & 18 & 19 & 20 & 21 & 22 & 23 & 24 & 25 & 26 & 27 & 28 & 29 & 30 & 31
± & E+126 & f_2 f_4} & f_5 ... f_8} & f_9 ... f_12} & f_13 ... f_16} & f_17 ... f_20} & f_21 ... f_24}>
ここで,指数部はEに126を足した「ゲタばき表現」で表され, Eは-125から128の値をとる. 仮数部は2進の24桁で,f_1は常に1と決っているので省略される. ただし, Eが-126(ゲタばき表現の指数部が0) の時には, f_1=0と見なして,より小さな数を表現するが, 当然 2進24桁の精度はない. また,E=129(ゲタばき表現の指数部が255) の時は, 無限大など特殊な数字を表すのに用いられ, 実数演算はできない. 0は全てのビットが0である.
この方法で表される正規数(f_1 ≠ 0)のうち 絶対値最大のものは (1-2^-24) 2^128 = 3.40282347 10^38 であり,絶対値最小のものは 2^-1 2^-125 = 1.17549435 10^-38 である. 非正規数(f_1=0)まで含めて,絶対値最小のものは, 2^-24 2^-125 = 1.40129846 10^-45 である.
また,この方法で表される正規数の相対誤差は f_1=f_2=...=f_24=1 の時, 最も小さくて 約2^-25 3 10^-8 f_1=1, f_2= ... = f_6=0 の時, 最も大きくて 約2^-24 6 10^-8 である. ただし,これは実数を丸める時に 25桁目を0捨1入(四捨五入の2進数版)した場合で, IEEE規格ではその他の丸めも許されている. 切捨ての場合は,この2倍になる. もちろん,非正規数はこの限りではない.
このように,同じビット数で実数を表現しても, 実数として表現できる範囲や精度はシステムによって異なる. 電脳ライブラリでは,このようなシステム依存の定数を MATH1/SYSLIB の GLpSET/GLpGET で管理している.
我々の身の回りにあるコンピュータで採用されている 表現方法を以下の表に示す.
計算機 OS コンパイラ 浮動小数点表現方法 備考 FACOM MSP(汎用) FORT77EX IBM FACOM XMP(UNIX) FORT77EX IBM HITAC VOS3(汎用) ?? IBM HITAC HIUXM(UNIX) f77 IBM SUN UNIX SUN IEEE FORTRAN PC9801 MS-DOS F77L(Lahey) IEEE PC9801 MS-DOS BASIC その他*注(*): 2進表現でIEEEに近いが, 符号ビットの位置や指数部のゲタの値などが異なる.
Back to Main
Latex Source
地球流体電脳倶楽部 : 95/6/9 (Version 5.0)NUMAGUTI Atusi <a1n@gfdl.gov> Last Modified: Thu Aug 31 13:03:59 EDT 1995