2.変数・配列

2-3. 実数を扱うには

◆実数を扱うには

整数型も終わり『実数型』に突入します。

実数型の最初はfloatです。

データ長の長さは開発環境によって違いますが現在は32ビットが多いと思います。

気になる方は以下のプログラムを実行してみてください。
(今回はこのプログラムについての解説はありません)

#include<stdio.h>

main()
{
    printf("char   = %d byte\n",sizeof(char));
    printf("int    = %d byte\n",sizeof(int));
    printf("float  = %d byte\n",sizeof(float));
    printf("double = %d byte\n",sizeof(double));
}

ちなみにVC++4.0では
char = 1 byte
int = 4 byte
float = 4 byte
double = 8 byte

と表示されました。1byte = 8bit よりそれぞれ
char = 8 bit
int = 32 bit
float = 32 bit
double = 64 bit

になります。

前置きが長くなりましたが宣言の仕方はいつもどうりに、

float f;

でよいのですが今度は数値の代入の仕方に気をつけることがあります。

f = 2133.3123;

とするのはいいのですが、整数を代入した場合コンパイラによっては警告が出されますので。

f = 10.0;

と言うかんじに.0を付けることをオススメします。

とういうことで、代入した値をprintf()で表示させましょう。

#include<stdio.h>

main()
{
    float f;
    f = 2133.3123;       /* コンパイラによってはここでも警告が出る */
    printf("f = %f\n",f);
}

実行すると

f = 2133.312256

と表示されました。どの開発環境でも代入によって誤差が発生するこ
とがあります。

※2進数と10進数の間で割り切れない数値に違いがあり、10進→2進→10進と変換したときに切り捨てられた端数が誤差として発生するためです。

また、printf()では%fが使われています。これは小数として表示する働きがあります。

◆もう一つの実数型

上記でfloat型を取り扱いましたが、さらにもう一つ実数型が存在します。
それはdoubleという倍精度実数型(倍長実数型と呼ぶ場合もある)です。

倍精度(倍長)の名の通りfloatの約2倍の指数(2倍長の小数)を扱うことができます。

データ長もfloatの2倍になり、64ビットになります。
(処理系に依存しますが…)

floatでは固定小数として表示しましたが実数型の変数は浮動小数なので、floatもdoubleも実際に代入されている値は、

1.234e+12 1.234×10の12乗

のようになっています。

ということで、double型の変数を宣言して、指数形式で表示します。

#include<stdio.h>

int main()      /* 今回 int main() にしましたが気にしなくて結構です */
{
    float  f;
    double d;

    f = 1234.567f;  /* 数値の後の f に注目 */
    d = 0.000123;

    printf("変数 f = %e\n",f);
    printf("変数 d = %e\n",d);

    return 0;  /* int main() にしたので付加しています */
}

どうなりましたか?
前回のプログラムで警告が出た方も今回のは出てきてないと思います。

画面には

変数 f = 1.234567e+003
変数 d = 1.230000e-004

と表示されていると思います(上の例はVC++4.0)

e-004 は10のマイナス4乗の意味です。

ここでもprintf()の新しい使い方をしています。

%e は変数(定数)を指数形式に表示する意味を持ちます。

今まで紹介してきた %d %f %c %e はprintfの変換指定子とよばれます。
変数のデータ型に依存しないので使い方を間違えてもコンパイルエラーになりませんし計算結果にも影響は起きません。

ただ、小数を%dで整数として表示すると小数点以下は四捨五入されます。