プログラミングにおける誤差
有限のメモリ上にデータを記憶する以上、誤差を避けて通ることはできません。
誤差にも様々な種類がありますが、ここではプログラムを書く上で留意すべきものをいくつか紹介します。
打切り誤差
doubleやfloatなどの不動小数点型の変数はx*10^yという形でxとyをメモリに格納しています。このxを基数部、yを指数部といいます。
何を言いたいのかというと、これはどんな数でも表せるわけではないということです。
メモリは有限なので、基数部の情報が大きすぎると、下位桁は切り捨てられます。
その為、1/3や円周率πなどの無限小数は厳密には表すことは出来ません。
また、無限小数の演算そのものも途中で打ち切られる場合があります。
桁あふれ
オーバーフローともいいます。
不動小数点型に限らず、変数のもつメモリ領域は有限なので、記憶できるデータの範囲が決まっています。
その範囲から外れたデータは正しく記憶出来ません。
error_sample.c
#include <stdio.h> void main(void) { short a = 1 * 10^10; printf("%d\n", a); return 0; }
上記のプログラムを実行すると表示される値は0になります。
short型の値を取れる範囲は-32768~32767の間なので、その範囲に入らない桁数の分は記憶できずに記憶できる下位桁の情報のみが残ります。