法大奥山研究室

 previous  contents

4.3. floatdoublelong double型変数


 これまで整数型変数を扱ってきました。ここでは,少数が扱える floatdoublelong 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.14F2.345L1E-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

という出力を得ます。

 計算の精度や桁数については,doublefloat の倍のメモリ領域を使うため,double の方が高い訳ですが,そのベースとなる浮動小数点の計算式は次の通りです。[C99, 5.2.4.2.2, 2]

sign beΣk=1pfkb-k

二進法の場合,b = 2fk01 をとります。精度と桁数は ep で決まることとなります。次は,be などの確認です。

/* 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_RADIXFLT_MIN_EXP などの定数(マクロ)はライブラリ float.h で定義されています。float の場合,e が -125 から 128 をとり,p が 24 です。一方,double は,e が -1021 から 1024 をとり,p が 53 です。桁数は float38double308 です。


 previous  contents