とらりもんHOME  Index  Search  Changes  Login

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言語入門に戻る>

Last modified:2022/08/09 19:12:30
Keyword(s):
References:[C言語入門]