C++教科書/標準ライブラリ編/<cfloat>の章

編集

概要

編集

<cfloat>ヘッダーは、C++標準ライブラリの型サポートライブラリの一部で、浮動小数点数の特性を定義するためのマクロを提供します。このヘッダーは、もともとC標準ライブラリの<float.h>から継承されています。浮動小数点数の型の限界値や精度、丸め方式などの情報が得られます。

マクロ定義

編集

<cfloat>ヘッダーで定義されているマクロの一覧を以下の表に示します。

<cfloat>ヘッダーで定義されているマクロの一覧
マクロ名 説明 float値の例 double値の例 long double値の例
FLT_ROUNDS 浮動小数点数の丸め方式を指定 1 (近接値へ丸める) 1 1
FLT_EVAL_METHOD すべての算術演算の精度を指定 0 (引数の型の範囲) 0 0
FLT_HAS_SUBNORM 非正規化数(デノーマル数)をサポートするかどうか (-1=不明、0=無し、1=有り) 1 1 1
DBL_HAS_SUBNORM 同上 1 1 1
LDBL_HAS_SUBNORM 同上 1 1 1
FLT_RADIX 浮動小数点数の基数 2 2 2
FLT_MANT_DIG 精度を失わずに表現可能な基数の桁数 24 53 53
DBL_MANT_DIG double型の同上 - 53 -
LDBL_MANT_DIG long double型の同上 - - 53
FLT_DECIMAL_DIG 10進数変換の最低精度 9 17 17
DBL_DECIMAL_DIG double型の10進数変換精度 - 17 -
LDBL_DECIMAL_DIG long double型の10進数変換精度 - - 17
DECIMAL_DIG 10進変換の最低精度 (最大のDECIMAL_DIG) 17 17 17
FLT_DIG 10進数の精度保証桁数 6 15 15
DBL_DIG double型の同上 - 15 -
LDBL_DIG long double型の同上 - - 15
FLT_MIN_EXP 最小指数の値 -125 -1021 -1021
DBL_MIN_EXP double型の同上 - -1021 -
LDBL_MIN_EXP long double型の同上 - - -1021
FLT_MIN_10_EXP 最小の10の負指数値 -37 -307 -307
DBL_MIN_10_EXP double型の同上 - -307 -
LDBL_MIN_10_EXP long double型の同上 - - -307
FLT_MAX_EXP 最大指数の値 +128 +1024 +1024
DBL_MAX_EXP double型の同上 - +1024 -
LDBL_MAX_EXP long double型の同上 - - +1024
FLT_MAX_10_EXP 最大の10の正指数値 +38 +308 +308
DBL_MAX_10_EXP double型の同上 - +308 -
LDBL_MAX_10_EXP long double型の同上 - - +308
FLT_MAX 最大の有限値 3.402823e+38 1.797693e+308 1.797693e+308
DBL_MAX double型の最大の有限値 - 1.797693e+308 -
LDBL_MAX long double型の最大の有限値 - - 1.797693e+308
FLT_EPSILON 1.0と次に大きい値の差 1.192093e-07 2.220446e-16 2.220446e-16
DBL_EPSILON double型の同上 - 2.220446e-16 -
LDBL_EPSILON long double型の同上 - - 2.220446e-16
FLT_MIN 最小の正の正規化数 1.175494e-38 2.225074e-308 2.225074e-308
DBL_MIN double型の最小の正の正規化数 - 2.225074e-308 -
LDBL_MIN long double型の最小の正の正規化数 - - 2.225074e-308
FLT_TRUE_MIN 最小の正の値 1.401298e-45 4.940656e-324 4.940656e-324
DBL_TRUE_MIN double型の最小の正の値 - 4.940656e-324 -
LDBL_TRUE_MIN long double型の最小の正の値 - - 4.940656e-324

マクロの詳細

編集

ここでは主要なマクロについて詳しく説明します。

FLT_ROUNDS
浮動小数点数の丸め方式を指定します。値は以下の通りです。
-1
丸め方式が決まっていない
0
往復最近接値に丸める
1
最近接値に丸める(0.5の場合は領域外側)
2
最近接値に丸める(0.5の場合は+∞側)
3
領域内側に切り捨てる
4
領域外側に切り上げる
FLT_EVAL_METHOD
すべての算術演算がどの精度で実行されるかを指定します。値は以下の通りです。
0
引数の型の範囲で実行される
1
拡張された範囲や精度で実行される
2
引数の型にかかわらず、常に最大範囲/精度で実行される
FLT_HAS_SUBNORM, DBL_HAS_SUBNORM, LDBL_HAS_SUBNORM
非正規化数(デノーマル数)をサポートするかどうかを示します。値は以下の通りです。
-1
サポート状況が不明
0
非正規化数をサポートしない
1
非正規化数をサポートする
FLT_RADIX
浮動小数点数の基数(radix)を表します。通常は2(=二進数表現)です。
FLT_MANT_DIG, DBL_MANT_DIG, LDBL_MANT_DIG
基数での精度を失わずに表現可能な桁数を示します。つまり、有効桁数の最大値です。
FLT_DECIMAL_DIG, DBL_DECIMAL_DIG, LDBL_DECIMAL_DIG
10進数と内部浮動小数点数表現の相互変換において、少なくともこの桁数の精度が保証されます。つまり、この桁数までは丸めや桁落ちが発生しません。
DECIMAL_DIG
10進変換の最低精度をあらわし、FLT_DECIMAL_DIG、DBL_DECIMAL_DIG、LDBL_DECIMAL_DIGの中で最大の値が設定されます。
FLT_DIG, DBL_DIG, LDBL_DIG
10進数の精度保証桁数です。つまり、この桁数までの値への変換は、元の値と同じになることが保証されています。
FLT_MIN_EXP, DBL_MIN_EXP, LDBL_MIN_EXP
最小指数の値を表します。この値より小さな指数の値は、±0または非正規化数になります。
FLT_MIN_10_EXP, DBL_MIN_10_EXP, LDBL_MIN_10_EXP
最小の10の負指数値を表します。10のこの負の指数乗の値は、正規化された最小の正の値になります。
FLT_MAX_EXP, DBL_MAX_EXP, LDBL_MAX_EXP
最大指数の値を表します。この値を超える指数の値は無限大になります。
FLT_MAX_10_EXP, DBL_MAX_10_EXP, LDBL_MAX_10_EXP
最大の10の正指数値を表します。10のこの正の指数乗の値は、最大の有限の値になります。
FLT_MAX, DBL_MAX, LDBL_MAX
各浮動小数点数型で表現可能な最大の有限値です。
FLT_EPSILON, DBL_EPSILON, LDBL_EPSILON
1.0と次に大きい値の差を表します。つまり、1.0に対する上側の相対的な表現精度を示します。
FLT_MIN, DBL_MIN, LDBL_MIN
正規化された最小の正の値です。この値を下回ると、非正規化数(サブノーマル)になります。
FLT_TRUE_MIN, DBL_TRUE_MIN, LDBL_TRUE_MIN
浮動小数点数として表現可能な最小の正の値です。0に最も近い正の値となります。

これらのマクロを使うことで、プログラム内で使用する浮動小数点数の特性を簡単に取得することができ、より適切な計算や値の扱いが可能になります。

使用例

編集
#include <iostream>
#include <cfloat>
#include <iomanip>

int main() {
    std::cout << "float の最小値: " << FLT_TRUE_MIN << std::endl;
    std::cout << "float の最大値: " << FLT_MAX << std::endl;
    std::cout << "float の精度  : " << FLT_DIG << " 桁" << std::endl;

    double d = 1.0/DBL_EPSILON;
    std::cout << std::setprecision(DBL_DIG+2);
    std::cout << "1.0 + DBL_EPSILONの値: " << 1.0 + DBL_EPSILON << std::endl;
    std::cout << "1.0 + 1/DBL_EPSILONの値: " << d << std::endl;

    return 0;
}

関連項目

編集

浮動小数点数の制限値については、<cfloat>ヘッダー以外にも以下のようなものがあります。

std::numeric_limits<T> (C++98から)
浮動小数点数の型Tの様々な特性を取得できるクラステンプレート
<limits> (C++11から)
整数型などの数値型の特性について定義したヘッダー

特に、std::numeric_limits<T>では浮動小数点数に関する多くのメンバー関数が用意されており、現代的なC++プログラミングでは<cfloat>よりもこちらを利用することが多くなっています。