この授業の最初の方で述べたように, 整数は二進数として一定の長さの記憶領域(ふつうは32ビット)に納められる. これで表現可能な範囲は, -(2の31乗) から (2の31乗)-1, つまりだいたい-20億から20億くらいになり, その範囲であれば整数値を正確に表現できる.
これに対して, 1.5 とか, 6.02×10の23乗 とかを表すために, ふたつの二進数 M, E を使って 「M×(16のE乗)」を表すことにした. これが浮動小数点数で, 実際には M と E は一定のビット数(ふつうは32ビット)に まとめてつめこんである. このやり方の特徴は
なお, 「倍精度浮動小数点型」(C言語では double; 教科書P. 234)をつかうと, こちらは64ビットのメモリを使う代わりに, 精度は10進15桁, 範囲も(10の±308乗)まで表現できる.
float x; char buffer[256]; … gets(buffer); x = atof(buffer);
float x; … printf("%f\n", x);
とやると, i には整数値 3 が代入される.int i; float x; x = 3.14; i = x;
ここで, よくある失敗の例. 整数どうしの割り算で商を小数点以下まで求めようとして,
とやっても, x には 0.33… ではなく 0.0 が入ってしまう. なぜかというと, 右辺の割り算をする段階では除数も被除数も整数だから整数の除算(商は切り捨て)が おこなわれて整数値 0 が求まり, それを x に代入する段になってやっと浮動小数点数に 変換されるからである.int i, j; float x; i = 1; j = 3; x = i / j;
0.33…をもとめるためには, 除数か被除数どちらか(あるいは両方)を前もって浮動小数点数に 変換しておく必要があって, たとえば作業用の変数 fi を使って
とやってもいいし, 式の中に型変換の指定(キャスト cast という; 教科書 p.219)を書いてint i, j; float x; float fi; i = 1; j = 3; fi = i; x = fi / j;
とやってもいい. (こちらのほうがわかりやすいね)int i, j; float x; i = 1; j = 3; x = ((float)i) / j;