C言語入門3. 変数の型
<C言語入門に戻る>
型とは
本節では「型」(かた)という概念を学ぶ。型とは, C言語(だけでなく他の様々なプログラミング言語でも)において, データの表現法を区別する概念である。型は, 計算機の中で実際にデータをどのように扱うかを規定するので, 大変重要である。
型の例を, 前回のrepeat.cというサンプルプログラムで説明しよう。その中に,
7. int i; 8. int s=0;
というのがあった。この"int"が「型」の一例である。intはintegerつまり「整数」からとられた, C言語の用語であり, 「整数型」を意味する。「整数型」は, そのデータが表すのは1つの整数である, という意味だ。int i; というのは, 「iという整数型の変数を使いますよ」という宣言である。
整数型の変数に, 整数ではない実数を代入することはできない。試してみよう。
以下のソースコードをtest.cという名で作って保存し, コンパイルして実行してみよう:
#include <stdio.h> int main(){ int i; i=2.5; printf("%d\n", i); }
$ gcc test.c $ ./a.out 2
変数iには2.5を代入したのに, その値は2と表示されてしまった。それは, iがもともと整数だと宣言されたからである。
では、このソースコードをちょっと変えて以下のようにしてみよう:
#include <stdio.h> int main(){ float i; i=2.5; printf("%f\n", i); }
変更箇所は2つである。int i;がfloat i;になったことと, printfの中の%dが%fになったことである。これを改めてtest.cという名で保存し, 実行してみよう:
$ gcc test.c $ ./a.out 2.500000
首尾よく2.5が表示された。ここで"int"のかわりに使った"float"は, 「単精度実数型」という型である。そのことを次節で説明する。
浮動小数点実数
ここまでは, 主に整数を扱って簡単な計算を試してきたが, 実際の実務や研究では, いずれ実数(整数だけでなく小数も)を扱う必要も出てくるだろう。小数を含む実数の計算には, 「実数型」という種類の変数を使う。実数型の変数は, 浮動小数点という仕組みのおかげで, 有効数字の部分と位取りの部分をわけて記録するため, 広大な範囲の数を扱うことが出来る。
具体的には, 実数型にはさらにfloat型とdouble型という2つの種類がある。その違いは, 1つの実数をどのくらいの情報量で扱うか, である。float型は4バイトの情報量で1つの実数を扱うが, double型はその倍, すなわち8バイトの情報量で1つの実数を扱う。当然, 後者の方が, 広大な範囲の実数を, しかも正確に扱うことができる。以下にその違いをまとめる:
- float型 (単精度実数型ともいう) ... 4バイト; 約 1.5 × 10-45 〜 3.4 × 1038。参考
- double型 (倍精度実数型ともいう) ... 8バイト; 約 5.0 × 10-324 〜 1.7 × 10308。参考
情報量の多い型(バイト数の多い型; この場合はfloatよりもdouble)を使えば, とりえる値の範囲が広いとか, 精度が高い, などの面で有利である。しかし, メモリーを余分に消費し, スピードも落ちるという不利も生じる。
例えば, 1から9までの逆数の和(1/1 + 1/2 + 1/3 + ... + 1/9)を計算するプログラムは, 以下のようになる(左端の行番号は入力不要。右端の//で始まるコメントも入力不要):
1. /* float_test.c */ 2. /* 2008/07/15 K. Nasahara */ 3. /* 1/1 + 1/2 + 1/3 + ... + 1/9 */ 4. # include <stdio.h> 5. main() 6. { 7. int i; 8. float s=0; 9. for (i=1; i<=9; i++) 10. s=s+1.0/i; // 1.0にしないと, 整数演算になってしまい, 1/2や1/3はゼロになってしまう。 11. printf("%f\n", s); // 実数型のフォーマットは%fである。 12. }
10行目が計算部分だが, ここで1.0/iのかわりに1/iとするとうまくいかない。それは, iが整数型変数なので, 1/iは整数どうしの割算となってしまい, 整数の範囲内で演算が行われるからである。つまり, iが2以上ならすべて, 1/iはゼロと計算されてしまう。それを避けるためには, 1を1.0と表現するなどして, 演算対象の一部を実数型にしてやる。そうすれば, 演算は実数の範囲で行われることになる。
課題3-1: ひとつの整数nをキーボードから読み込んで, 1からnまでの数の2乗の逆数の総和を計算するプログラムを作れ。nが十分に大きければ, この和は1.64493...(円周率の二乗/6)になるはずである。
<C言語入門に戻る>
Keyword(s):
References:[C言語入門]