C 標準ライブラリ -<float.h>
概要
<float.h>C 標準ライブラリ内のヘッダファイルであり、浮動小数点数型(float、doubleとlong double)に関するマクロ。これらのマクロは、浮動小数点数の特性と制限(最大値、最小値、精度など)を提供します。
C 標準ライブラリのfloat.hヘッダファイルには、浮動小数点値に関連するプラットフォーム依存の定数のセットが含まれています。これらの定数は ANSI C によって導入され、プログラムの移植性を高めています。これらの定数を説明する前に、浮動小数点数が次の4つの要素で構成されていることを理解しておくとよいでしょう。
| 構成要素 | 構成要素の説明 |
|---|---|
| S | 符号 ( +/- ) |
| b | 指数表現の基数。2は2進数、10は10進数、16は16進数などを表します。など... |
| e | 指数、最小値とemin最大値のemax間の整数。 |
| p | 精度(基数 b の有効桁数) |
上記の4つの構成要素に基づくと、浮動小数点数の値は次のようになります。
floating-point = ( S ) p x be
或
floating-point = (+/-) precision x baseexponent
ライブラリマクロ
以下の値は実装定義であり、#define ディレクティブによって定義されます。これらの値は、以下に示す値以上でなければなりません。すべてのインスタンスにおいて、FLT は float 型、DBL は double 型、LDBL は long double 型を指すことに注意してください。
単精度浮動小数点数(float)
FLT_RADIX:浮動小数点数の基数(通常は2)。FLT_MANT_DIG:float型の有効桁数。FLT_DIG:float型の10進精度。つまり、誤差なく表現できる最大の10進桁数。FLT_MIN_EXP:float型の最小負指数(基数を底とする)。FLT_MIN_10_EXP:float型の最小負10進指数。FLT_MAX_EXP:float型の最大指数(基数を底とする)。FLT_MAX_10_EXP:float型の最大10進指数。FLT_MAX:float型の最大正の値。FLT_MIN:float型の最小正の値。FLT_EPSILON:float型の相対誤差。すなわち、1.0 と 1.0 より大きい最小の浮動小数点数の差。
倍精度浮動小数点数(double)
DBL_MANT_DIG:double型の有効桁数。DBL_DIG:double型の10進精度。DBL_MIN_EXP:double型の最小負指数(基数を底とする)。DBL_MIN_10_EXP:double型の最小負10進指数。DBL_MAX_EXP:double型の最大指数(基数を底とする)。DBL_MAX_10_EXP:double型の最大10進指数。DBL_MAX:double型の最大正の値。DBL_MIN:double型の最小正の値。DBL_EPSILON:double型の相対誤差。
拡張精度浮動小数点数(long double)
LDBL_MANT_DIG:long double型の有効桁数。LDBL_DIG:long double型の10進精度。LDBL_MIN_EXP:long double型の最小負指数(基数を底とする)。LDBL_MIN_10_EXP:long double型の最小負10進指数。LDBL_MAX_EXP:long double型の最大指数(基数を底とする)。LDBL_MAX_10_EXP:long double型の最大10進指数。LDBL_MAX:long double型の最大正の値。LDBL_MIN:long double型の最小正の値。LDBL_EPSILON:long double型の相対誤差。
例
以下の例は、float.h ファイルで定義されているいくつかの定数の使用法を示しています。
例
#include <stdio.h>
#include <float.h>
int main() {
printf("Single precision (float):\n");
printf("FLT_RADIX: %d\n", FLT_RADIX);
printf("FLT_MANT_DIG: %d\n", FLT_MANT_DIG);
printf("FLT_DIG: %d\n", FLT_DIG);
printf("FLT_MIN_EXP: %d\n", FLT_MIN_EXP);
printf("FLT_MIN_10_EXP: %d\n", FLT_MIN_10_EXP);
printf("FLT_MAX_EXP: %d\n", FLT_MAX_EXP);
printf("FLT_MAX_10_EXP: %d\n", FLT_MAX_10_EXP);
printf("FLT_MAX: %e\n", FLT_MAX);
printf("FLT_MIN: %e\n", FLT_MIN);
printf("FLT_EPSILON: %e\n", FLT_EPSILON);
printf("\nDouble precision (double):\n");
printf("DBL_MANT_DIG: %d\n", DBL_MANT_DIG);
printf("DBL_DIG: %d\n", DBL_DIG);
printf("DBL_MIN_EXP: %d\n", DBL_MIN_EXP);
printf("DBL_MIN_10_EXP: %d\n", DBL_MIN_10_EXP);
printf("DBL_MAX_EXP: %d\n", DBL_MAX_EXP);
printf("DBL_MAX_10_EXP: %d\n", DBL_MAX_10_EXP);
printf("DBL_MAX: %e\n", DBL_MAX);
printf("DBL_MIN: %e\n", DBL_MIN);
printf("DBL_EPSILON: %e\n", DBL_EPSILON);
printf("\nExtended precision (long double):\n");
printf("LDBL_MANT_DIG: %d\n", LDBL_MANT_DIG);
printf("LDBL_DIG: %d\n", LDBL_DIG);
printf("LDBL_MIN_EXP: %d\n", LDBL_MIN_EXP);
printf("LDBL_MIN_10_EXP: %d\n", LDBL_MIN_10_EXP);
printf("LDBL_MAX_EXP: %d\n", LDBL_MAX_EXP);
printf("LDBL_MAX_10_EXP: %d\n", LDBL_MAX_10_EXP);
printf("LDBL_MAX: %Le\n", LDBL_MAX);
printf("LDBL_MIN: %Le\n", LDBL_MIN);
printf("LDBL_EPSILON: %Le\n", LDBL_EPSILON);
return 0;
}
#include <float.h>
int main() {
printf("Single precision (float):\n");
printf("FLT_RADIX: %d\n", FLT_RADIX);
printf("FLT_MANT_DIG: %d\n", FLT_MANT_DIG);
printf("FLT_DIG: %d\n", FLT_DIG);
printf("FLT_MIN_EXP: %d\n", FLT_MIN_EXP);
printf("FLT_MIN_10_EXP: %d\n", FLT_MIN_10_EXP);
printf("FLT_MAX_EXP: %d\n", FLT_MAX_EXP);
printf("FLT_MAX_10_EXP: %d\n", FLT_MAX_10_EXP);
printf("FLT_MAX: %e\n", FLT_MAX);
printf("FLT_MIN: %e\n", FLT_MIN);
printf("FLT_EPSILON: %e\n", FLT_EPSILON);
printf("\nDouble precision (double):\n");
printf("DBL_MANT_DIG: %d\n", DBL_MANT_DIG);
printf("DBL_DIG: %d\n", DBL_DIG);
printf("DBL_MIN_EXP: %d\n", DBL_MIN_EXP);
printf("DBL_MIN_10_EXP: %d\n", DBL_MIN_10_EXP);
printf("DBL_MAX_EXP: %d\n", DBL_MAX_EXP);
printf("DBL_MAX_10_EXP: %d\n", DBL_MAX_10_EXP);
printf("DBL_MAX: %e\n", DBL_MAX);
printf("DBL_MIN: %e\n", DBL_MIN);
printf("DBL_EPSILON: %e\n", DBL_EPSILON);
printf("\nExtended precision (long double):\n");
printf("LDBL_MANT_DIG: %d\n", LDBL_MANT_DIG);
printf("LDBL_DIG: %d\n", LDBL_DIG);
printf("LDBL_MIN_EXP: %d\n", LDBL_MIN_EXP);
printf("LDBL_MIN_10_EXP: %d\n", LDBL_MIN_10_EXP);
printf("LDBL_MAX_EXP: %d\n", LDBL_MAX_EXP);
printf("LDBL_MAX_10_EXP: %d\n", LDBL_MAX_10_EXP);
printf("LDBL_MAX: %Le\n", LDBL_MAX);
printf("LDBL_MIN: %Le\n", LDBL_MIN);
printf("LDBL_EPSILON: %Le\n", LDBL_EPSILON);
return 0;
}
上記のプログラムをコンパイルして実行すると、次の結果が得られます。
Single precision (float): FLT_RADIX: 2 FLT_MANT_DIG: 24 FLT_DIG: 6 FLT_MIN_EXP: -125 FLT_MIN_10_EXP: -37 FLT_MAX_EXP: 128 FLT_MAX_10_EXP: 38 FLT_MAX: 3.402823e+38 FLT_MIN: 1.175494e-38 FLT_EPSILON: 1.192093e-07 Double precision (double): DBL_MANT_DIG: 53 DBL_DIG: 15 DBL_MIN_EXP: -1021 DBL_MIN_10_EXP: -307 DBL_MAX_EXP: 1024 DBL_MAX_10_EXP: 308 DBL_MAX: 1.797693e+308 DBL_MIN: 2.225074e-308 DBL_EPSILON: 2.220446e-16 Extended precision (long double): LDBL_MANT_DIG: 64 LDBL_DIG: 18 LDBL_MIN_EXP: -16381 LDBL_MIN_10_EXP: -4931 LDBL_MAX_EXP: 16384 LDBL_MAX_10_EXP: 4932 LDBL_MAX: 1.189731e+4932 LDBL_MIN: 3.362103e-4932 LDBL_EPSILON: 1.084202e-19
<float.h>浮動小数点数型の特性と制限を記述するための一連のマクロを提供します。これらのマクロを使用することで、浮動小数点数に関連する境界条件や特殊なケースを処理する、より堅牢なコードを作成できます。