%表題   MISC1 (その他の基本処理下位パッケージ)
%
%履歴
%\Drireki{
%         92/01/17 酒井  敏
%         92/04/22 林祥介   (4.1版)
%         94/04/23 塩谷雅人 (5.z版)
%         95/04/21 塩谷雅人
%        }
%
%=======================================================================
\section{実数の内部表現}
 %  \label{real}


整数の内部表現に関しては, 
ほとんどの機種で同一の表現となっているのに対して, 
実数型に関してはいくつかの規格が存在する. 
このように実数表現形式の異なる計算機同志でデータを交換するための
ユーティリティーが REALLIB である. 
\vspace{1em}

一般に, 実数型の変数は浮動小数点の形で表現される. 
すなわち, $\beta$進法を使った場合, 実数は
\begin{equation}
  \pm(0. f_1 f_2 f_3 \cdots f_m)_\beta \times \beta^{\pm E}
\end{equation}
という形で表されている. 
ここで, 
\begin{equation}
  \pm(0. f_1 f_2 f_3 \cdots f_m) = 
  \pm (f_1 \times \beta^{-1} + f_2 \times \beta^{-2} 
     + f_3 \times \beta^{-3} + \cdots f_m \times \beta^{-m})
\end{equation}
は, 仮数部で$f_i$は0から$\beta-1$までの整数, $f_1 \neq 0 $ である. 
また, $E$は指数部で0または正の整数である. 
\vspace{1em}

ほとんどのメインフレーム系の計算機で使用されている実数表現は
IBM形式と呼ばれるものである. 
これに対して, UNIXなどのコンパイラでは
IEEE(アイ・トリプル・イーと読む)規格を採用しているものが多い. 
どちらも, 32ビットを1語とする点は同じであるが, 
採用されている進法が異なり, 
表現できる実数の範囲や精度に違いがある. 

%------------------------------- IBM -----------------------------------
\begin{itemize}
  \item {\bf IBM形式} 
    \begin{quote}
      これは富士通, 日立などのいわゆるIBMコンパチ汎用機で採用されている
      16進法の浮動小数点形式である. 
      これらの計算機はもともと事務処理などのデータ処理が便利なように
      作られているため, 16進演算が基本になっている. 
      各ビットの使い方は以下の通り. 
      \vspace{1em}

      \begin{center}
        {\setlength{\tabcolsep}{0.5mm}
        \begin{tabular}%
          {|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|}
          \hline
           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 \\
          \hline
          $\pm$ & \multicolumn{7}{c|}{$E+64$} &
          \multicolumn{4}{c|}{$f_1$} & \multicolumn{4}{c|}{$f_2$} & 
          \multicolumn{4}{c|}{$f_3$} & \multicolumn{4}{c|}{$f_4$} & 
          \multicolumn{4}{c|}{$f_5$} & \multicolumn{4}{c|}{$f_6$} \\
          \hline
        \end{tabular}
        }
      \end{center}
      \vspace{1em}

      ここで, 指数部は負にならないように$E$に64を足した
      「ゲタばき表現」で表され, 
      $E$は-64から63の値をとる. 
      仮数部は16進の6桁で, 7桁目は\.切\.捨\.てられる. 
      0は, この表示体系にはなじまない数値であるので, 
      別途, 「全てのビットが0である数値」という定義がなされている. 
      \vspace{1em}

      この方法で表される0でない数値のうち絶対値最大のものは
      \begin{equation}
        (1-16^{-6}) \times 16^{63} = 7.237005 \times 10^{75}
      \end{equation}
      であり, 絶対値最小のものは
      \begin{equation}
        16^{-1} \times 16^{-64} = 5.397605 \times 10^{-79}
      \end{equation}
      である. 
      \vspace{1em}

      また, 
      この方法で表される数値の相対誤差は $f_1=f_2=\cdots = f_6=15$の時, 
      最も小さくて
      \begin{equation}
       約16^{-6} \approx 6 \times 10^{-8}
      \end{equation}
      $f_1=1$, $f_2= \cdots = f_6=0$ の時, 最も大きくて
      \begin{equation}
        約16^{-5} \approx 10^{-6}
      \end{equation}
      である. 
      このように$f_1$の値が小さいと, 
      その上位ビットが無駄になってしまうので精度が極端に悪くなる. 

    \end{quote}

%------------------------------- IEEE ----------------------------------
  \item {\bf IEEE形式}
    \begin{quote}
      これはUNIXマシンなどで採用されている
      2進法の浮動小数点形式である. 
      最近では, この形式を採用する計算機が多い. 
      これは, IBM形式に比べて相対精度が高いという特徴がある. 
      各ビットの使い方は以下の通り. 
      \vspace{1em}

      \begin{center}
        {\setlength{\tabcolsep}{0.5mm}
        \begin{tabular}%
          {|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|}
          \hline
           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 \\
          \hline
          $\pm$ & \multicolumn{8}{c|}{$E+126$} &
          \multicolumn{3}{c|}{$ f_{2}  \cdot \cdot  f_{4}$}  &
          \multicolumn{4}{c|}{$ f_{5}  \cdots \cdot f_{8}$}  &
          \multicolumn{4}{c|}{$ f_{9}  \cdots \cdot f_{12}$} &
          \multicolumn{4}{c|}{$ f_{13} \cdots \cdot f_{16}$} &
          \multicolumn{4}{c|}{$ f_{17} \cdots \cdot f_{20}$} & 
          \multicolumn{4}{c|}{$ f_{21} \cdots \cdot f_{24}$} \\
          \hline
        \end{tabular}
        }
      \end{center}
      \vspace{1em}

      ここで, 指数部は$E$に126を足した「ゲタばき表現」で表され, 
      $E$は$-125$から128の値をとる. 
      仮数部は2進の24桁で, $f_1$は常に1と決っているので省略される. 
      ただし, 
      $E$が$-126$ (ゲタばき表現の指数部が0) の時には, 
      $f_1=0$と見なして, より小さな数を表現するが, 
      当然 2進24桁の精度はない. 
      また, $E=129$ (ゲタばき表現の指数部が255) の時は, 
      無限大など特殊な数字を表すのに用いられ, 
      実数演算はできない.  
      0は全てのビットが0である. 
      \vspace{1em}

      この方法で表される正規数($f_1 \neq 0$)のうち
      絶対値最大のものは
      \begin{equation}
        (1-2^{-24}) \times 2^{128} = 3.40282347 \times 10^{38}
      \end{equation}
      であり, 絶対値最小のものは
      \begin{equation}
        2^{-1} \times 2^{-125} = 1.17549435 \times 10^{-38}
      \end{equation}
      である. 
      非正規数($f_1=0$)まで含めて, 絶対値最小のものは, 
      \begin{equation}
        2^{-24} \times 2^{-125} = 1.40129846 \times 10^{-45}
      \end{equation}
      である. 
      \vspace{1em}

      また, この方法で表される正規数の相対誤差は 
      $f_1=f_2=\cdots=f_{24}=1$ の時, 
      最も小さくて
      \begin{equation}
        約2^{-25} \approx 3 \times 10^{-8}
      \end{equation}
      $f_1=1$, $f_2= \cdots = f_6=0$ の時, 最も大きくて
      \begin{equation}
        約2^{-24} \approx 6 \times 10^{-8}
      \end{equation}
      である. 
      ただし, これは実数を丸める時に
      25桁目を0捨1入(四捨五入の2進数版)した場合で, 
      IEEE規格ではその他の丸めも許されている. 
      切捨ての場合は, この2倍になる. 
      もちろん, 非正規数はこの限りではない. 

    \end{quote}
\end{itemize}
このように, 同じビット数で実数を表現しても, 
実数として表現できる範囲や精度はシステムによって異なる. 
電脳ライブラリでは, このようなシステム依存の定数を MATH1/SYSLIB の
{\tt GL}{\it p}{\tt SET/}{\tt GL}{\it p}{\tt GET} で管理している. 
\vspace{1em}

我々の身の回りにあるコンピュータで採用されている
表現方法を以下の表に示す. 
\begin{center}
  \begin{tabular}{ccccc}
      \hline
      計算機  &  OS       & コンパイラ  & 浮動小数点表現方法 & 備考 \\
      \hline
      FACOM   & MSP(汎用)   & FORT77EX     & IBM           &       \\
      FACOM   & XMP(UNIX)   & FORT77EX     & IBM           &       \\
      HITAC   & VOS3(汎用)  & ??           & IBM           &       \\
      HITAC   & HIUXM(UNIX) & f77          & IBM           &       \\
      SUN     & UNIX        & SUN FORTRAN  & IEEE          &       \\
      PC9801  & MS$-$DOS    & F77L(Lahey)  & IEEE          &       \\
      PC9801  & MS$-$DOS    & BASIC        & その他*       &       \\
      \hline
  \end{tabular}

  注($*$): 2進表現でIEEEに近いが, 
      符号ビットの位置や指数部のゲタの値などが異なる. 

\end{center}
