とらりもんHOME  Index  Search  Changes  Login

とらりもん - 実数変数 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

<[[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"は, 「単精度実数型」という型である。そのことを次節で説明する。

!浮動小数点実数
 ここまでは, 主に整数を扱って簡単な計算を試してきたが, 実際の実務や研究では, いずれ実数(整数だけでなく小数も)を扱う必要も出てくるだろう。小数を含む実数の計算には, 「実数型」という種類の変数を使う。実数型の変数は, [[浮動小数点|http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0]]という仕組みのおかげで, 有効数字の部分と位取りの部分をわけて記録するため, 広大な範囲の数を扱うことが出来る。

 具体的には, 実数型にはさらに{{fontc(float型,red)}}と{{fontc(double型,red)}}という2つの種類がある。その違いは, 1つの実数をどのくらいの情報量で扱うか, である。float型は4バイトの情報量で1つの実数を扱うが, double型はその倍, すなわち8バイトの情報量で1つの実数を扱う。当然, 後者の方が, 広大な範囲の実数を, しかも正確に扱うことができる。以下にその違いをまとめる:

* float型 (単精度実数型ともいう) ... 4バイト; 約 1.5 × 10""-45"" 〜 3.4 × 10""38""。[[参考|https://e-words.jp/w/%E5%8D%98%E7%B2%BE%E5%BA%A6%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0%E5%9E%8B.html]]
* double型 (倍精度実数型ともいう) ... 8バイト; 約 5.0 × 10""-324"" 〜 1.7 × 10""308""。[[参考|https://e-words.jp/w/%E5%80%8D%E7%B2%BE%E5%BA%A6%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0%E5%9E%8B.html]]

 情報量の多い型(バイト数の多い型; この場合は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; s=s+1.0/i;        // 1.0にしないと, 整数演算になってしまい, 1/2や1/3はゼロになってしまう。
    11.   }
    12.
printf("%f\n", s);  // 実数型のフォーマットは%fである。
    13. 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言語入門]]に戻る>