Subsections
本日は実数型の誤差について学習することになっているが,整数型についても述べておく.
整数の場合,C言語の
intでは32ビット(4バイト)で表現される.このビット数で,-
2147483648〜2147483647までを表す.整数型の場合,この範囲であれば後で述べる実数型
で生じる誤差は起きない.整数型で気を付けることは,演算結果がこの範囲を超えるオー
バーフローのみである.
最小整数と最大整数は,リスト1のプログラムで確認できる.この内容を理
解するためには整数の2の補数表現の理解が不可欠である.忘れた者は,私の講義ノート
の2の補数
のところを見よ.
1 #include <stdio.h>
2
3 int main(void){
4
5 int min, max;
6
7 min=0x80000000;
8 max=0x7fffffff;
9
10 printf("size of int = %d\n",sizeof(int));
11 printf("min = %d\n",min);
12 printf("max = %d\n",max);
13
14 return 0;
15 }
実際のC言語での小数の表現方法,すなわちメモリーのビットパターンがどうなっている
かは,結構難しい.
以前のプリントで少し示している
が,これをすべて理解するのは結構大変である.興味のある者は,自分で勉強せよ.
教科書に示している2つの実数を2進数で表現すると,
となる.C言語の倍精度実数型(
double)の場合,2進数の小数点以下と指数部,符号
がメモリーに格納されることになる.
を2進数で表現すると循環小数になる
ので,コンピューターではその近似値を扱うことになる.私のパソコンでは,
|
(3) |
という値が格納されていた.元々,循環小数であったものが途中で丸められているのであ
る.したがって,12.8ではなくその近似値
|
(4) |
|
|
がメモリーに格納されている.要するにコンピューターでは正確に実数を扱うことが出来
ないのである.実数を扱うプログラムを書く場合,このことは肝に命じておかなくてはな
らない.
一方,
は循環小数とはならず,2進数の有限の桁数で表現できる.この場合
は,メモリーに格納される値も正確に
である.C言語の倍精度実数型
(double)の場合,2進数の仮数部が53桁以内であれば正確に実数を表現できる.仮数
部は53ビットの情報で表現していることによる.したがって,誤差は54ビット目あたりで
生じ,およそ
となる.C言語のdouble型の演算では,
〜
程度の計算誤差が生じる.この辺の詳しい話は,私の講義ノート
の浮動小数点表示を見て欲しい.
付録にこの辺を確認するプログラムを載せておく.
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
2006-02-06