next up previous contents
Next: 1.4.0.0.2 計算機イプシロン(machine epsilon) Up: 1.4 浮動小数点数 (floating-point numbers) Previous: 1.4 浮動小数点数 (floating-point numbers)

1.4.0.0.1 例(ミニ浮動小数点体系).

$\beta=2$, $n=3$, $m_{{}_L}=1, m_{{}_U}=2$ とすると?是非各自で $F$ の要素を書き出して、数直線上にメモって欲しい。(まず原点に関して対称。 最大の絶対値 $(1/2+1/4+1/8)2^2=7/2$. $0$ でない最小の絶対値 $(1/2)2^{-1}=1/4$. 各々の区間 $[1/4,1/2),[1/2,1),[1,2),[2,4)$ では等間 隔。)

数直線上に表してみると、左右に広漠な空きがあること、またゼロの付近も ひどく空いていることに気付く。 これは一般的な特徴である。

実際の計算機では、符号、仮数部、小数部のそれぞれを2進数 (ビットの列) で表すことになる ($\pm\beta^n f$ が前節で説明した方法で表現される)。

SPARCstation 上の FORTRAN では、単精度 (32bits) の場合、符号1ビット、 指数部 7 ビット、仮数部 24 ビット (ただしいわゆるケチ表現をしている)。 倍精度の場合は、符号1ビット、指数部 10 bit、仮数部 53 bit である。

問題点

(i).
絶対値が極端に大きい数、極端に小さい数は表現できない。入力が出来ない のはもちろんであるし、 演算の結果がそうなることもある(オーバーフロー (overflow)、アンダーフロー(underflow))。
(ii).
F は有限集合なので、ほとんどすべての数は近似的にしか表現できない。 入力の際も演算の際も近似をする必要がある。 例. $\beta=1/2$ では $\frac{1}{10}$ すら表現できない。

\begin{displaymath}
\frac{1}{10}=(0.0001100110011001100\cdots)_2
\end{displaymath}

(iii).
演算に伴う丸め誤差, 情報落ち, 狭い意味の丸め(演算の結果は F に属さないので適当に丸める)。
(iv).
桁落ち

大雑把に言って、浮動小数点数の体系は相対誤差を一定量で押えるよ うになっている$F$ に属する数の絶対値の最大値を $U$, $F\setminus
\{0\}$ に属する数の絶対値の最小値を $L$ とし、 $D(F) = \{x; L\le \vert x\vert
\le U\}$ とおく。$x\in D(F)$ に対し、

\begin{displaymath}
fl(x)=\mbox{\lq\lq $x$\ に最も近い $F$
の元(2 つある時はどちらか一方を適当なルールで決める)''}
\end{displaymath}

とおく。$fl(x)$$x$ を近似的に表現する $F$ の要素で最良のものだと考 えられる。このとき

\begin{displaymath}
\displaystyle\left\vert\frac{fl(x)-x}{x}\right\vert\le \frac{1}{2}\beta^{1-n}
\end{displaymath}

演算の際の丸めについて。 $x, y\in F$ としても $x+y\in F$ であるとは 限らない。計算機の中の加算 $\oplus$ はうまく実現した場合で

\begin{displaymath}
x\oplus y = fl(x+y)
\end{displaymath}

が成立する。 $x\oplus y$$x+y$ の差を浮動小数点加算 $\oplus$ で生じ た丸め誤差と呼ぶ。

$\oplus$ はあまり良い性質を持たない。($F$ が体のような代数系になら ないのはまあ仕方ないにしても)可換則は OK であるが、結合則や分配則は成 立しない。このことは誤差の解析を難しくする原因になっている。

例. $s_N=\displaystyle\sum_{n=1}^N \frac{1}{n}$ を計算することを 考える。$N=100000$ とした計算例。

oyabun% test1
s=1.209085083007812e+01           n が小さい方から足していった(単精度)
s=1.209015274047852e+01           n が大きい方から足していった(単精度)
s=1.209014612986334e+01           n が小さい方から足していった(倍精度)
S=1.209014612986341e+01           n が大きい方から足していった(倍精度)

consider $1.0+0.010+0.010+0.010+0.010+0.010+0.010+0.010+0.010+\cdots+0.010$

これは情報落ち(桁揃えの段階で仮数部が捨てられる)と呼ばれる現象。


next up previous contents
Next: 1.4.0.0.2 計算機イプシロン(machine epsilon) Up: 1.4 浮動小数点数 (floating-point numbers) Previous: 1.4 浮動小数点数 (floating-point numbers)
Masashi Katsurada
平成17年6月2日