C++/標準ライブラリ/cfloat

カテゴリ:Book:C++#標準ライブラリ/cfloat%20

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

概要

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

マクロ定義

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

<cfloat>ヘッダーで定義されているマクロの一覧
マクロ名説明float値の例double値の例long double値の例
FLT_ROUNDS浮動小数点数の丸め方式を指定1 (近接値へ丸める)11
FLT_EVAL_METHODすべての算術演算の精度を指定0 (引数の型の範囲)00
FLT_HAS_SUBNORM非正規化数(デノーマル数)をサポートするかどうか (-1=不明、0=無し、1=有り)111
DBL_HAS_SUBNORM同上111
LDBL_HAS_SUBNORM同上111
FLT_RADIX浮動小数点数の基数222
FLT_MANT_DIG精度を失わずに表現可能な基数の桁数245353
DBL_MANT_DIGdouble型の同上-53-
LDBL_MANT_DIGlong double型の同上--53
FLT_DECIMAL_DIG10進数変換の最低精度91717
DBL_DECIMAL_DIGdouble型の10進数変換精度-17-
LDBL_DECIMAL_DIGlong double型の10進数変換精度--17
DECIMAL_DIG10進変換の最低精度 (最大のDECIMAL_DIG)171717
FLT_DIG10進数の精度保証桁数61515
DBL_DIGdouble型の同上-15-
LDBL_DIGlong double型の同上--15
FLT_MIN_EXP最小指数の値-125-1021-1021
DBL_MIN_EXPdouble型の同上--1021-
LDBL_MIN_EXPlong double型の同上---1021
FLT_MIN_10_EXP最小の10の負指数値-37-307-307
DBL_MIN_10_EXPdouble型の同上--307-
LDBL_MIN_10_EXPlong double型の同上---307
FLT_MAX_EXP最大指数の値+128+1024+1024
DBL_MAX_EXPdouble型の同上-+1024-
LDBL_MAX_EXPlong double型の同上--+1024
FLT_MAX_10_EXP最大の10の正指数値+38+308+308
DBL_MAX_10_EXPdouble型の同上-+308-
LDBL_MAX_10_EXPlong double型の同上--+308
FLT_MAX最大の有限値3.402823e+381.797693e+3081.797693e+308
DBL_MAXdouble型の最大の有限値-1.797693e+308-
LDBL_MAXlong double型の最大の有限値--1.797693e+308
FLT_EPSILON1.0と次に大きい値の差1.192093e-072.220446e-162.220446e-16
DBL_EPSILONdouble型の同上-2.220446e-16-
LDBL_EPSILONlong double型の同上--2.220446e-16
FLT_MIN最小の正の正規化数1.175494e-382.225074e-3082.225074e-308
DBL_MINdouble型の最小の正の正規化数-2.225074e-308-
LDBL_MINlong double型の最小の正の正規化数--2.225074e-308
FLT_TRUE_MIN最小の正の値1.401298e-454.940656e-3244.940656e-324
DBL_TRUE_MINdouble型の最小の正の値-4.940656e-324-
LDBL_TRUE_MINlong 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>よりもこちらを利用することが多くなっています。

カテゴリ:Book:C++#標準ライブラリ/cfloat%20 カテゴリ:C++
カテゴリ:Book:C++ カテゴリ:C++ カテゴリ:Pages using the JsonConfig extension