📓

プログラムはなぜ動くのか 3章

2021/05/25に公開

コンピューターが少数点の計算を間違える(誤差が生まれる)理由

コンピューターは2進数で計算をしており、10進数の数を正確に表現できないから
例えば、小数点以下4桁で0.1を表現しようとしても、
0.0001 -> 0.0625
0.0010 -> 0.125
となるため、正確に0.1を表すことができない。
(この他にも桁溢れなどによる誤差もあるが、この章では割愛されている)

浮動小数の表し方

浮動小数は、以下の4つの項目で構成される (float と doubleで表現精度が異なる)

  • 符合ビット (1bit)
  • 仮数 (8bit or 11bit)
  • 基数 (2で固定)
  • 指数 (23bit or 52bit)

(符号) (仮数)×(基数)^(指数)

仮数部は、少数点以上の数を1とするように右シフトし、小数点以下が規定のbit数になるように0で埋めた後に少数部のみを取り出すことで表現する。
1101.0011
-> 0001.11010011
-> 0001.11010011000000000000000(floatの場合)
-> 11010011000000000000000

指数部は、イクセス表現にて表現する
イクセス表現とは中央値を0とすることで小数点以下を表現する方法

誤差を回避するためには

  1. 誤差を無視する: 誤差が問題にならない場合はこれが一番簡単
  2. 整数で扱いその後に割り算などで少数に戻す
  3. BCD形式を利用する

Discussion