Subsections

2 C言語での数の表現

2.1 整数型(int)

本日は実数型の誤差について学習することになっているが,整数型についても述べておく. 整数の場合,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 }

2.2 倍精度実数型(double)

実際のC言語での小数の表現方法,すなわちメモリーのビットパターンがどうなっている かは,結構難しい.以前のプリントで少し示している が,これをすべて理解するのは結構大変である.興味のある者は,自分で勉強せよ.

教科書に示している2つの実数を2進数で表現すると,

$\displaystyle (12.8)_{10}$ $\displaystyle =(1.1001100110011001100\cdots\times 10^{11})_2$ (1)
$\displaystyle (0.5)_{10}$ $\displaystyle =(1.0\times 10^{-1})_2$ (2)

となる.C言語の倍精度実数型(double)の場合,2進数の小数点以下と指数部,符号 がメモリーに格納されることになる. $ (12.8)_{10}$ を2進数で表現すると循環小数になる ので,コンピューターではその近似値を扱うことになる.私のパソコンでは,

$\displaystyle (12.8)_{10}\Rightarrow(1.1001100110011001100110011001100110011001100110011010\times 10^{11})_2$ (3)

という値が格納されていた.元々,循環小数であったものが途中で丸められているのであ る.したがって,12.8ではなくその近似値

$\displaystyle (1.1001100110011001100110011001100110011001100110011010\times 10^{11})_2$ (4)
$\displaystyle =(12.800000000000000710542735760100185871124267578125)_{10}$    

がメモリーに格納されている.要するにコンピューターでは正確に実数を扱うことが出来 ないのである.実数を扱うプログラムを書く場合,このことは肝に命じておかなくてはな らない.

一方, $ (0.5)_{10}$ は循環小数とはならず,2進数の有限の桁数で表現できる.この場合 は,メモリーに格納される値も正確に $ (0.5)_{10}$ である.C言語の倍精度実数型 (double)の場合,2進数の仮数部が53桁以内であれば正確に実数を表現できる.仮数 部は53ビットの情報で表現していることによる.したがって,誤差は54ビット目あたりで 生じ,およそ $ (2^{-54})=5.5\times 10^{-17}$ となる.C言語のdouble型の演算では, $ 10^{-16}$$ 10^{-17}$ 程度の計算誤差が生じる.この辺の詳しい話は,私の講義ノート の浮動小数点表示を見て欲しい.

付録にこの辺を確認するプログラムを載せておく.



ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
2006-02-06


no counter