7.実数の2進表現について
実数を表現するのに、浮動小数点表記を用いる。
たとえば、3.14159という数があったとき、先頭に小数点が来るように、
という、表記ができる。
先頭に小数点が来るように位置をずらすことを、正規化(normalize)といい、この記法を浮動小数点(floating point)表記という。
これに対して、通常の実数の 表記を、固定小数点(fixed point)表記という。
浮動小数点(floating point)表記により、実数は唯一の記法で表現される。
浮動小数点表記のとき、上の0.314159の部分を仮数(mantissa)、10を基数(base)、1を指数(expoment)と呼ぶ。
仮数部をM、基数をB、指数をEとおくと、一般の正の数は、
と一意的に書ける。実数は、基数を決めておけば、仮数と指数で1通りの書き方しかない。
通常、できるだけ大きな数を少ない桁で表現するため、基数としては16を用いる。
マイクロソフトのWindowsでは、B=2を採用している。
では、B=16としたとき、逆に実数を〔M、E〕の形にするにはどうすればよいだろうか。
これは、実数を16進数表現することに他ならない。
実数の整数部分と小数部分で分けて考える。
整数部分については、10進整数を16進数に変換する要領で求めることができる。
小数部分はどうすればよいだろう。
10進小数の場合で考えてみよう。
たとえば、0.456の小数第1位の数「4」はどのようにしたら得られるであろうか?
答えは極めて単純で、「10倍して小数点以下を切り捨てる」である。
0. 456を10倍して4.56。小数点以下を切り捨てれば「4」となる。
では、小数第2位の「5」はどうだろう。
小数点以下で切り捨てられた「0.56」を10倍して小数点以下を切り捨てれば、「5」は得られる。
以上をまとめると、
実数を16進数にする方法
① 実数を、整数部と小数以下部に分ける。
② 整数部は、前に述べた方法で16進数にする。
③ 小数以下部は、以下のようにして変換する。
まず、小数以下部の数を16倍する。このとき整数部に出た数が小数第1位の数である。
次に、また小数以下部を取り16倍する。このとき整数部に出た数が小数第2位の数である。
④ 以下、この操作を繰り返す。
【例題2】いま、B=16とする。このとき、234.90625を〔M、E〕で表現して答えよ。
(解答)まず、整数部分は、234÷16=14...10、 であるから、整数部分は「AE」となる。
小数部分は、0.90625であり、この部分は上の手順に従って変換する。すなわち、
0.90625×16=14.5
0.5×16=8.0
である。ゆえに、小数部分は0.E8(16)となる。
以上をあわせて、234.90625=AE.E8=0.AEE8×162 となり、求める答えは
〔0.AEE8、2〕となる。 ■
問題 B=16として、次の実数を〔M、E〕で表現して答えよ。
(1).124.65625 (2).314.16 (3).0.1
仮数部の長さによって、
実数表現の精度は決まる。
通常、4バイト浮動小数点数で表記される実数を単精度実数、8バイト浮動小数点数で表記される実数を倍精度実数、さらに、その倍の16バイト浮動小数点数で表記される実数を4倍精度実数、という。
単精度の4バイト実数は、1ビットの符号ビット、7ビットの指数部、3バイト(24ビット)の仮数部からなる。
倍精度の8バイト実数では仮数部は7バイト、4倍精度の16バイト実数では仮数部は15バイトで表現される。
指数部はすべて1バイトである。
符号ビットは、「0」で0または正の数、「1」で負の数を表す。
指数部は、7ビット部分を整数に直し、「64」を引く「。これにより、-64~63の指数を表す。
仮数部は、先頭ビットから (1/2)、(1/4) 、(1/8) 、…、の桁を表現する。
先頭のビットの前に、小数点があるようにするのである。
仮数部は、正規化を行ってから表現する。
16進数1桁は4ビットで構成されるので、単精度実数の場合、仮数部は16進数で6桁で表現できる。
倍精度実数の場合は、仮数部は16進数14桁で表現できる。
【例1】 10進数5.125を4バイト実数の16進表記にする。
まず、整数部は、5=5(16)。
小数以下は、0.125なので、
0.125×16=2.0 となる。ここで終わりで、
0.125=5.2(16)となる。
よって、5.2(16)=101.001(2)となる。
ゆえに、仮数部は0.52(16)。指数部は1。
指数部は、64を加えて64+1=65=1000001(2)。
仮数部は、520000(16)=0101 0010 0000 0000 0000 0000。
符号は正なので、0。
以上から、5.125を4バイト実数に直すと、
01000001 01010010 00000000 00000000
となる。
これは、16進数表記にすると、41520000、となる。
前回の問題の、(1)124.65625、(2)314.16、(3)0.1、の4バイト実数としての16進表記を求めてみよう。
これは、前回の問題の結果を利用すると、楽に解ける。
(1).124.65625
前回の結果から、124.65625=〔0.7CA8、2〕であるので、
仮数部は0.7CA8(16)。指数部は2。
指数部は、64を加えて64+2=66=1000010(2)。
仮数部は、7CA800(16)=0111 1100 1010 1000 0000 0000。
符号は正なので、0。
以上から、5.125を4バイト実数に直すと、
0100 0010 0111 1100 1010 1000 0000 0000
となる。
これは、16進数表記にすると、427CA800、となる。
(2).314.16
前回の結果から、314.16=〔0.13A28F5C、3〕 (網掛け部分は循環する)であるので、
仮数部は0.13A28F(16)。指数部は3。
指数部は、64を加えて64+3=67=1000011(2)。
仮数部は、13A28F(16)=0001 0011 1010 0010 1000 1111。
符号は正なので、0。
以上から、314.16を4バイト実数に直すと、
0100 0011 0001 0011 1010 0010 1000 1111
となる。
これは、16進数表記にすると、4313A28F、となる。
(3).0.1
前回の結果から、0.1=〔0.19、3〕 (網掛け部分は循環する)であるので、
仮数部は0.199999(16)。指数部は0。
指数部は、64を加えて64+0=64=1000000(2)。
仮数部は、199999(16)=0001 1001 1001 1001 1001 1001。
符号は正なので、0。
以上から、0.1を4バイト実数に直すと、
0100 0000 0001 1001 1001 1001 1001 1001
となる。
これは、16進数表記にすると、4019999、となる。
8.浮動小数点数による数値計算とその問題点
前回までに述べたように、コンピュータや電卓で計算される数値には、必ずといっていいほど誤差が含まれる。
このほかにも、コンピュータで数値計算を行う場合に4つの問題点がある。
①丸め誤差の発生
4バイト実数の場合、符号ビット1ビット、指数部7ビット、仮数部24ビット(16進数で6桁)の表示になるため、すべての実数がきちんとは表現されない。
たとえば、234.90625であれば、「42AEE800」となり、きちんと表現できるが、0.1などになると、16進表示にして、0.1999999・・・となり、2桁目以降は9が無限に連続する。
この場合、仮数部6桁しか表現できず、7桁目以降は切り捨てられてしまう。
結果的に、
0.199999(16)=0.099999642372・・・
というように正確に、0.1が表現できていないのである。
このように、10進数の数値を16進変換して、有限桁で打ち切ってしまうことから生じる誤差を丸め誤差(round off error)という。
一般に計算機では、
をみたす最小の正の数

をマシン・イプシロン(machine epsilon)と呼んでいる。
この数は、ε=1.0として、1+εの値を計算し、次にε/2の値を改めてεとして1+εの値を計算し、次にε/2の値を改めてεとして1+εの値を計算し、・・・、という操作を繰り返して、その値が1.0のなる直前がマシン・イプシロンの値になる。
エクセルの場合、15桁を超えた分はすべて0に変換されてしまうので、結果的に、
がわかる。この数よりも小さい数は、すべて無視されてしまうことがわかる。
このため、エクセルでは15ケタを超える16桁以降はすべて「0」とみなして数値を扱っている。
②オーバーフローとアンダーフロー
表現できる範囲を超えた演算をした場合に起こる現象である。
大きい場合をオーバーフロー(over flow)、小さい場合をアンダーフロー(under flow)という。
たとえば、エクセルの場合、

であるが、計算不能の表示が出る。

であるが、0になってしまう。
③桁落ち
符号が同じで大きさがほぼ等しい浮動小数点数の減算により生ずる誤差を、桁落ちという。
これは有効数字の桁数の減少を意味する。
たとえば、有効数字の桁数が6桁の2数 123.456と123.445に対して、
123.456-123.445=0.011
となり、有効数字の桁数は「2ケタ」に減少している。
2次方程式の解の公式で、分子が異符号になる解に対しては、近い数同士の引き算になるので、「分子の有理化」をして、計算精度を保証する。同符号の解に対しては、この現象は生じない。
④情報落ち
著しく大きさの異なる浮動小数点数で、加算のときに小さいほうの数の一部または全部の桁が無視されてしまうことから生じる誤差を、情報落ちという。
エクセルでは、15桁ずれると、小さいほうが無視され、A+B=A となってしまう。
以上のことから、「コンピュータが計算した結果は正しい」という伝説は、誤りであることがわかる。
正しい結果が得られるように、計算順序を変えるなどしないと、正しい結果を得ることは難しい。
最終更新:2015年11月16日 18:13