固定小数点数と浮動小数点数,演算の誤差とシフト演算

固定小数点数

  • データの最小単位をビットという。「0」と「1」のこと。
  • 8ビット=1バイト
  • 16ビット=1ワード(のことが多い)
  • 符号なし固定小数点数は、0~255の256通りを表現

負数を補数を用いて表現する

メリットは、減算を加算で表現できること。補数は加えると0になる数。

反転させて、1を加算すると2の補数が作れる。

nビットの符号なし固定小数点数の有効桁数は、10進数で何桁になるのか

2n=10x(10をx乗すると、2nになる。桁数と〇乗は対応するから)

x=㏒102n

=n×㏒102(㏒102=0.301)

=n×0.301

[alert title=”乗用対数の公式”]

aM=n㏒aM

[/alert]

浮動小数点数の正規化

仮数部分の最上位の桁が0にならないようにすることを正規化という。誤差を少なくするため。

16ビット(符号S=1bit,指数E=4bit,仮数M=8bit)の浮動小数点数で、(0.375)10を正規化した表現は?

まず正の数なので、S=0。

(0.375)10=(0.011)2

仮数部の最上位桁が0にならないように正規化すると、

0.11×2-1となるから、M=11。

ー1は10進数なので、2進数に直す。正の1が(0001)2なので、これを反転させて1を加算すればよい。

0001を反転すると1110、これに1を加算すると(1111)2となる。したがって、E=1111。

以上より、S=0,M=11,E=1111なので、

0111 1110 0000 0000

補助単位

補助単位 数値
k(キロ) 103
M(メガ) 106
G(ギガ) 109
T(テラ) 1012
補助単位 数値
m(ミリ) 10-3
μ(マイクロ) 10-6
n(ナノ) 10-9
p(ピコ) 10-12

演算の誤差(浮動小数点数の正規化の段階で誤差が生じる)

[memo title=”仮数部Mの誤差”]

  1. 丸め誤差:無限小数における四捨五入、切り上げ、切り捨てで発生。
  2. 桁落ち:絶対値が近い数値を減算すると、後ろの桁がごっそり落ちる。
  3. 情報落ち:絶対値の差が大きい数値の加減算をすると、大きい方に揃えたときに小数点が左に移動し過ぎて後ろの桁がはみ出て切り捨てられる。

[/memo]

桁落ち 36.6-36.5=0.1にならない

36.6-36.5=0.1

それぞれ正規化して減算すると、

36.6(0.10010010011…)×26

36.5(0.10010010000)×26

(0.10010010011…)×26ー(0.10010010000)×26=0000000000.11×26

0000000000.11×26を再び正規化すると、

0.11×26×2-9

=0.11×2-30.09375

当初の0.1から誤差が発生する。

情報落ち 100+0.05=100.05にならない

100+0.05=100.05

まず、普通に正規化をする。

100 (01100100.)×27

0.05(0.000011001100)×2-4

指数が7と―4で違っているので、そろえる。

通常、大きい方にそろえるので、0.05の小数点を操作する。27にするには、小数点を左に11個分移動させればよいので、

0.0000000000011001100×27となり、赤字部分がはみ出てしまい切り捨てられる。

すると、M=0になって、100+0=100になるため本来の答えと異なってしまう状況になる。正規化を挟むと情報が計算の途中で落ちてしまう。