実数データと文字列の扱い
先週の実数データの取扱いの説明のため、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’がついていることの説明。