とらりもんHOME  Index  Search  Changes  Login

とらりもん - 実数変数 Diff

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

<[[C言語入門]]に戻る>

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

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

* float型 (単精度実数型ともいう) ... (4バイト; 約 1.5 × 10""-45"" 〜 3.4 × 10""38"")
* double型 (倍精度実数型ともいう) ... (8バイト; 約 5.0 × 10""-324"" 〜 1.7 × 10""308"")


 情報量の多い型(バイト数の多い型; 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と表現するなどして, 演算対象の一部を実数型にしてやる。そうすれば, 演算は実数の範囲で行われることになる。

----
''課題'' ひとつの整数nをキーボードから読み込んで, 1からnまでの数の2乗の逆数の総和を計算するプログラムを作れ。nが十分に大きければ, この和は1.64493...(円周率の二乗/6)になるはずである。

<[[C言語入門]]に戻る>