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
です。