先週の実数データの取扱いの説明のため、N進数の説明を行う。
N進数の扱い
で表現されるN進数は、
なので、
で割った 余り が最下位桁
で、 商 が
となる。
小数点のN進数データ は、
なので、小数部にNを掛けた時の 整数部 は
で、 小数部は、
となる。
実数データは近似値
よって、 というデータを2進数に直すと、
となる。このため、0.1 は近似値でしか記憶できない。
実数がからむ間違ったプログラム例
これに関連して実数がからむよくある間違いを示す。
// プログラムは無限ループで止まらないかもしれない。
// 理由:0.1を10回加えても正確に1.0にならないかもしれない。
double x ;
for( x = 0.0 ; x != 1.0 ; x += 0.1 ) { // ★ x <= 1.0 で判定せよ!
printf( "%f\n" , x ) ;
}
// 平均の小数部が正しく表示されない。
// 理由1:s/c は整数どおしの計算で小数点以下が消える。
// 理由2:s/c が整数だと、%f は実数64bitのはずだけど、
// 32bitの整数0しか渡されない。
// 結果 :ゴミが表示される。
int s = ≪合計≫ ;
int c = ≪個数≫ ;
printf( "%f" , s / c ) ; // ★ (double)s / (double)c と書く
// sinの計算結果が全部0になる。
// 理由:th/180 は整数どおしの計算で 0 になる。
int th ;
for( th = 0 ; th < 90 ; th += 5 ) {
double x = sin( th / 180 * 3.141592 ) ; // ★ sin( (double)th / 180.0 * 3.141592 )
printf( "%f\n" , x ) ;
}
文字列の取扱い
C言語における文字の取扱いということで、ASCIIコード表の説明と、 ‘文字’と”文字列”の違いの説明と、文字列の末尾に’\0’がついていることの説明。