小数点数の計算を行った場合、プログラムの実行結果として正しい値が得られないことがある。
その理由と回避する方法について学習
コンピュータが計算を間違う理由
例として、1011.0011という小数点を持った2進数を10進数に変換する。
整数と同じように、小数点のお部分にも重みをかけて結果を加えれば求まる。
よって、11.1875となる。
2進数で表された小数点を10進数に変換する方法が分かれば、コンピュータが計算を間違える理由を理解できる。
その答えは「10進数の小数点数の中には、2進数に正確に変換できないものがある」から。
小数点以下4桁の2進数で表せる数値の範囲は、0.0000~0.1111となる。
だから、2進数の小数点数以下の重みである0.5、0.25、0.125、0.0625という4つの値の組み合わせの小数点数でしか表せない。
最終的には循環小数となり、プログラムで正しい計算結果が得られなくなる。
正規表現とイクセス表現
正規表現: 様々な形式で表せる浮動小数点数を統一的な表現にするための工夫。例えば10進数の0.75という小数点数なら下記のいずれの方法でも表現できるが、
0.75 = 0.75 * 10^0
0.75 = 75 * 10^-2
0.75 = 0.075 * 10^1
同じ数値を表すのに様々な表現方法があったのでは、コンピュータで処理するのが面倒になるので、ルールが必要。
例として、10進数の浮動小数点数なら「小数点以上は0として、小数点以下の1桁目は0でない値にする」というルールを決める。このルールに従えば、0.75は「0.75*10^0」という方法だけでしか表現できなくなる。
このようなルールに従って小数点数を表すのが正規表現。
イクセス表現: 指数部で表せる範囲の中央の値を示す工夫。例として1~13にトランプのカードを使ってマイナスの数を必要とするゲームを考案する。
この場合、中央の7というカードをゼロとみなすルールを適用する。7がゼロなので、10は+3、3は-4を表すことになる。