📓
プログラムはなぜ動くのか 3章
コンピューターが少数点の計算を間違える(誤差が生まれる)理由
コンピューターは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とすることで小数点以下を表現する方法
誤差を回避するためには
- 誤差を無視する: 誤差が問題にならない場合はこれが一番簡単
- 整数で扱いその後に割り算などで少数に戻す
- BCD形式を利用する
Discussion