資料シート●各科目

数の表現
実数
範囲が限定できない場合

http://www.infonet.co.jp/apt/March/syllabus/bookshelf/number/widereal.html




 [0, 1)の範囲の実数や[-1, 1)の範囲の実数は、段階的2等分法で符号化できる。
 段階的2等分法符号を使えば、数の大小の判定を符号の強弱に、足し算や引き算などの演算を符号の演算に置き換えて処理することが可能になる。
 しかし、段階的2等分法符号では、範囲から上下(左右?)に外れた数は表現できない。そのために、たとえば1に近い2個の数の足し算が正しく処理できないなどの問題が起こってしまう。
 符号系に使うビット列の長さが固定されている(たとえば8桁)限り、その符号系で表現できる数の種類も固定されてしまう(8桁なら28=256種類)のはしかたない。しかし、精度をいくらか犠牲にすれば、同じ長さのビット列を使って、もっと広い範囲の実数を表現できる符号系を作ることができる。

 広い範囲の実数をほどよい精度で表現できて、しかも(手順が少し複雑になるけれど)大小の判定や演算にも使える符号系として、浮動小数点符号系が使われている。
  浮動小数点符号系の組み立てをきちんと説明すると大変なので、だいたいの感じだけ説明する。

・何桁のビット列を使うか決める。ここでは16桁のビット列を使うことにする(実際には32桁とか64桁のような長いビット列を使う)。これをさらに1+10(全体の3/4ぐらい)+1+4(同じく1/4ぐらい)のように四つに分けておく。
・どんな数でも、何回か繰り返して2倍すると、前に決めた桁数の3/4ぐらいの桁のビット列でぎりぎり表現できるぐらいの大きさ(10桁とすると1024ぐらい)の数になる。もとの数(たとえば-0.75)からこのようにして作った数(-768 = -0.75×210)を仮数といい、仮数をもとの数に戻すのに必要な2倍する回数を指数(-10。小さくするために逆に1/2倍するのを繰り返さなければならないから負の数として数える)という。
・仮数(-768)と指数(-10)の正負のそれぞれを、前によけておいた二つの1桁のビットを使って表わす(正なら○:負なら×)。これらを仮数符号ビット(ここでは×)および指数符号ビット(たまたま同じく×)という
・仮数(-768))と指数(-10)のそれぞれに対して、まだ使っていない3/4のビット列と1/4のビット列のそれぞれを使って、絶対値(それぞれ768と10)を表わすビット列を作る。これらを仮数絶対値ビット列(ここでは○○××××××××)および指数絶対値ビット列(ここでは○×○×)という
・仮数に端数が残っていたら、切り捨てて自然な整数にしてからビット列を作る
・これらを順に並べて(たとえば16桁の)ビット列を作る(ここでは×-○○××××××××-×-○×○×ができる。"-"は実際にはつかない)。これで完了

 この方法を浮動小数点(floating point)法という。大きさを調整するのに2倍ではなくて10倍するやり方もある。
 例の場合はうまく端数が消えたけれど、ほとんどの数では端数が残り、それを切り捨てなければならない。つまり、浮動小数点法ではもとの数の下の桁は正しく表現されていない。しかし、0に近い数ではこうした精度の犠牲はそれほどひどくない。しかも、0から離れるにしたがってだんだん精度は悪くなるが、その分だけ整数部分の桁数は増えているので、小数点の左右の桁の長さを合わせて考えれば、別に精度は落ちていない。
 このように、浮動小数点法は、何億何兆のような大きい(端数部分をもたないかもしれない)数を、16桁ぐらいの短いビット列でかなり正確に表わすのにも使える。


 数学の実数には、小数で表わそうとすると端数が無限に続いてしまうような数が含まれる(それどころか、そんな数の方がずっと多いことが知られている)。たとえば1/3、r2(=2の平方根)、πなどの実数はそんな数だ。
 でも、ここで紹介する方法では、そういう数は正確には表現できない(表現できるようなほかのもっと高度な方法はあるが)。だから、これを実数というのはちょっと嫌な気もする。



コンピュータ


Copyleft(C) 1996-04, by Studio-ID(ISIHARA WATARU). All rights reserved.


最新更新
04-03-30