ホーム » スタッフ » 斉藤徹 » 実数データと文字列の扱い

2008年5月
« 4月   6月 »
 123
45678910
11121314151617
18192021222324
25262728293031

最近の投稿(電子情報)

アーカイブ

カテゴリー

実数データと文字列の扱い

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