float,double,long double型変数 これまで整数型変数を扱ってきました。ここでは,少数が扱える float,double,long double型変数の初期化方法を見ます。
/* Example 4.3 */
#include <stdio.h>
int main(void)
{
       float x = 3.14F;
       double y = 1E-5;
       long double z = 2.345L;
       printf("(x) %f, %E", x, x);
       printf("(y) %f, %E", y, y);
       printf("(z) %Lf, %LE", z, z);
       return 0;
}
3.14F や 2.345L,1E-5 は「浮動小数点定数」(floating constant)と呼ばれる定数です。変換指定子 %f は小数点表示,%E は指数表示での出力を意味します。但し,long double の場合には L を付す必要があります。[C99, 7.19.6.1, 7] 実行すると,
(x) 3.140000, 3.140000E+00 (y) 0.000010, 1.000000E-05 (z) 2.345000, 2.345000E+00
という出力を得ます。
 計算の精度や桁数については,double が float の倍のメモリ領域を使うため,double の方が高い訳ですが,そのベースとなる浮動小数点の計算式は次の通りです。[C99, 5.2.4.2.2, 2]
sign beΣk=1pfkb-k
二進法の場合,b = 2 で fk は 0 か 1 をとります。精度と桁数は e と p で決まることとなります。次は,b や e などの確認です。
/* Example 4.4 */
#include <stdio.h>
#include <float.h>
int main(void)
{
       printf("\tb\te\t\tp\tMIN\t\tMAX\n");
       printf("\t\tMIN\tMAX\n");
       printf("float\t%d\t%d\t%d\t%d\t%E\t%E\n",
              FLT_RADIX, FLT_MIN_EXP, FLT_MAX_EXP, FLT_MANT_DIG, FLT_MIN, FLT_MAX);
       printf("double\t%d\t%d\t%d\t%d\t%E\t%E\n",
              FLT_RADIX, DBL_MIN_EXP, DBL_MAX_EXP, DBL_MANT_DIG, DBL_MIN, DBL_MAX);
       return 0;
}
出力結果(奥山研究室の場合)
        b       e               p       MIN             MAX
                MIN     MAX
float   2       -125    128     24      1.175494E-38    3.402823E+38
double  2       -1021   1024    53      2.225074E-308   1.797693E+308
FLT_RADIX や FLT_MIN_EXP などの定数(マクロ)はライブラリ float.h で定義されています。float の場合,e が -125 から 128 をとり,p が 24 です。一方,double は,e が -1021 から 1024 をとり,p が 53 です。桁数は float が 38,double が 308 です。