最終更新日時: 2026年06月15日 14時22分22秒 (JST)
Akira Takahashi が更新

履歴 編集

<cfloat>

# cfloat

`<cfloat>`ヘッダでは、浮動小数点数に関連する定数値マクロを定義する。これは、C言語の標準ライブラリ`<float.h>`と同じである。

本ヘッダはフリースタンディング環境でも提供される。

浮動小数点数 $x$ は以下のようにモデル化される。

$$x = sb^e\sum^p_{k=1}f_kb^{-k},\qquad e_{\rm min} \le e \le e_{\rm max}$$

各パラメータは以下の通り。

$$ \begin{array}{ll} s&\text{符号($\pm 1$)}\\ b&\text{指数表現の基数(1 より大きい整数)}\\ e&\text{指数(最小 $e_{\rm min}$ 最大 $e_{\rm max}$ の整数)}\\ p&\text{精度(基数 $b$ での仮数部の桁数)}\\ f_k&\text{$b$ より小さい非負整数(仮数部の有効数字)}\\ \end{array} $$

浮動小数点型で表される値としては、ゼロと $f_1 \gt 0$ である正規化数の他に、$e = e_{\rm min}$ かつ $f_1 = 0$ である非正規化数（subnormal numbers）、$e \gt e_{\rm min}$ かつ $f_1 = 0$ である正規化されていない数（unnormalized numbers）、および、浮動小数点数ではない無限大や NaN 等が含まれているかもしれない（実装によっては含まれていないかもしれない）。
NaN とは非数（Not-a-Number）を表し、ほとんど全ての演算で浮動小数点例外を起こさず結果に伝播する quiet NaN（quiet：静かな）と、演算のオペランドに使用されると浮動小数点例外を引き起こす signaling NaN（signaling：信号を発する）がある。
ゼロと浮動小数点数ではない値（無限大や NaN 等）には符号があるかもしれない（実装によっては無いかもしれない）。

本ヘッダで提供される整数値を表すマクロは、`FLT_ROUNDS` を除いて `#if` プリプロセッサディレクティブに使用可能な定数式である。

## 丸め

マクロ | 説明 | 対応バージョン
--- | --- | ---
`FLT_ROUNDS` | 浮動小数点加算の丸めモード |

## 基数

マクロ | 説明 | 対応バージョン
--- | --- | ---
`FLT_RADIX` | 指数表現の基数。 上記モデルでは、$b$ |

## 浮動小数点の評価方法

マクロ | 説明 | 対応バージョン
--- | --- | ---
`FLT_EVAL_METHOD` | 浮動小数点数がどのように評価されるかを表す整数値 | C++11

## 桁数

マクロ | 説明 | 対応バージョン
--- | --- | ---
`FLT_DIG` | `float`で正確に表現可能な10進数の最大の桁数。 上記モデルでは、$b$ が $10$ の累乗の場合、$p \log_{10} b$、それ以外の場合、$\lfloor (p - 1)\log_{10} b\rfloor$ |
`DBL_DIG` | `double`で正確に表現可能な10進数の最大の桁数。 上記モデルでは、$b$ が $10$ の累乗の場合、$p \log_{10} b$、それ以外の場合、$\lfloor (p - 1)\log_{10} b\rfloor$ |
`LDBL_DIG` | `long double`で正確に表現可能な10進数の最大の桁数。 上記モデルでは、$b$ が $10$ の累乗の場合、$p \log_{10} b$、それ以外の場合、$\lfloor (p - 1)\log_{10} b\rfloor$ |
`FLT_DECIMAL_DIG` | `float`の数値を10進数で正確に表すのに必要な有効数字の桁数。 上記モデルでは、$b$ が $10$ の累乗の場合、$p \log_{10} b$、それ以外の場合、$\lceil 1 + p \log_{10} b\rceil$ | C++17
`DBL_DECIMAL_DIG` | `double`の数値を10進数で正確に表すのに必要な有効数字の桁数。 上記モデルでは、$b$ が $10$ の累乗の場合、$p \log_{10} b$、それ以外の場合、$\lceil 1 + p \log_{10} b\rceil$ | C++17
`LDBL_DECIMAL_DIG` | `long double`の数値を10進数で正確に表すのに必要な有効数字の桁数。 上記モデルでは、$b$ が $10$ の累乗の場合、$p \log_{10} b$、それ以外の場合、$\lceil 1 + p \log_{10} b\rceil$ | C++17
`DECIMAL_DIG` | 精度が一番高い浮動小数点型の数値を10進数で正確に表すのに必要な有効数字の桁数。 上記モデルでは、$p_{\rm max}$ を精度が一番高い浮動小数点型の $p$ とすると、$b$ が $10$ の累乗の場合、$p_{\rm max} \log_{10} b$、それ以外の場合、$\lceil 1 + p_{\rm max}\log_{10} b\rceil$ | C++11 C++26で非推奨
`FLT_MANT_DIG` | `float`を基数 `FLT_RADIX` で表現した際の仮数部の桁数。 上記モデルでは、$p$ |
`DBL_MANT_DIG` | `double`を基数 `FLT_RADIX` で表現した際の仮数部の桁数。 上記モデルでは、$p$ |
`LDBL_MANT_DIG` | `long double`を基数 `FLT_RADIX` で表現した際の仮数部の桁数。 上記モデルでは、$p$ |

## 機械イプシロン

マクロ | 説明 | 対応バージョン
--- | --- | ---
`FLT_EPSILON` | `float`における、$1$ と $1$ より大きい最小の数との差。（機械イプシロン） 上記モデルでは、$b^{1-p}$ |
`DBL_EPSILON` | `double`における、$1$ と $1$ より大きい最小の数との差。（機械イプシロン） 上記モデルでは、$b^{1-p}$ |
`LDBL_EPSILON` | `long double`における、$1$ と $1$ より大きい最小の数との差。（機械イプシロン） 上記モデルでは、$b^{1-p}$ |

## 非正規化数

マクロ | 説明 | 対応バージョン
--- | --- | ---
`FLT_HAS_SUBNORM` | `float`における非正規化数のサポート状況を判定する | C++17 C++26で非推奨
`DBL_HAS_SUBNORM` | `double`における非正規化数のサポート状況を判定する | C++17 C++26で非推奨
`LDBL_HAS_SUBNORM` | `long double`における非正規化数のサポート状況を判定する | C++17 C++26で非推奨

## 無限大とNaN

マクロ | 説明 | 対応バージョン
--- | --- | ---
`INFINITY` | `float`型の正の無限大 | C++26で`<cfloat>`に追加
`NAN` | `float`型のquiet NaN | C++26で`<cfloat>`に追加
`FLT_SNAN` | `float`型のシグナルNaN | C++26
`DBL_SNAN` | `double`型のシグナルNaN | C++26
`LDBL_SNAN` | `long double`型のシグナルNaN | C++26

## バージョン情報

マクロ | 説明 | 対応バージョン
--- | --- | ---
`__STDC_VERSION_FLOAT_H__` | `<cfloat>`が提供するC標準ライブラリ機能のバージョン (`202311L`) | C++26

## 最大値

マクロ | 説明 | 対応バージョン
--- | --- | ---
`FLT_MAX` | `float`の最大の有限値。 上記モデルでは、$(1-b^{-p})b^{e_{\rm max}}$ |
`DBL_MAX` | `double`の最大の有限値。 上記モデルでは、$(1-b^{-p})b^{e_{\rm max}}$ |
`LDBL_MAX` | `long double`の最大の有限値。 上記モデルでは、$(1-b^{-p})b^{e_{\rm max}}$ |
`FLT_MAX_10_EXP` | $10$ の $n$ 乗が、`float`の有限の値として表現可能であるような、最大の整数値 $n$。 上記モデルでは、$\lfloor\log_{10} ((1-b^{-p})b^{e_{\rm max}})\rfloor$ |
`DBL_MAX_10_EXP` | $10$ の $n$ 乗が、`double`の有限の値として表現可能であるような、最大の整数値 $n$。 上記モデルでは、$\lfloor\log_{10} ((1-b^{-p})b^{e_{\rm max}})\rfloor$ |
`LDBL_MAX_10_EXP` | $10$ の $n$ 乗が、`long double`の有限の値として表現可能であるような、最大の整数値 $n$。 上記モデルでは、$\lfloor\log_{10} ((1-b^{-p})b^{e_{\rm max}})\rfloor$ |
`FLT_MAX_EXP` | `FLT_RADIX` の $n - 1$ 乗が、`float`の有限の値として表現可能であるような、最大の整数値 $n$。 上記モデルでは、$e_{\rm max}$ |
`DBL_MAX_EXP` | `FLT_RADIX` の $n - 1$ 乗が、`double`の有限の値として表現可能であるような、最大の整数値 $n$。 上記モデルでは、$e_{\rm max}$ |
`LDBL_MAX_EXP` | `FLT_RADIX` の $n - 1$ 乗が、`long double`の有限の値として表現可能であるような、最大の整数値 $n$。 上記モデルでは、$e_{\rm max}$ |

## 最小値

マクロ | 説明 | 対応バージョン
--- | --- | ---
`FLT_MIN` | `float`の正の正規化数のうち最小のもの。 上記モデルでは、$b^{e_{\rm min} - 1}$ |
`DBL_MIN` | `double`の正の正規化数のうち最小のもの。 上記モデルでは、$b^{e_{\rm min} - 1}$ |
`LDBL_MIN` | `long double`の正の正規化数のうち最小のもの。 上記モデルでは、$b^{e_{\rm min} - 1}$ |
`FLT_TRUE_MIN` | `float`の正の最小値 | C++17
`DBL_TRUE_MIN` | `double`の正の最小値 | C++17
`LDBL_TRUE_MIN` | `long double`の正の最小値 | C++17
`FLT_MIN_10_EXP` | $10$ の $n$ 乗が`float`の正の正規化数であるような最小の負の整数値 $n$。 上記モデルでは、$\lceil\log_{10} b^{e_{\rm min} - 1}\rceil$ |
`DBL_MIN_10_EXP` | $10$ の $n$ 乗が`double`の正の正規化数であるような最小の負の整数値 $n$。 上記モデルでは、$\lceil\log_{10} b^{e_{\rm min} - 1}\rceil$ |
`LDBL_MIN_10_EXP` | $10$ の $n$ 乗が`long double`の正の正規化数であるような最小の負の整数値 $n$。 上記モデルでは、$\lceil\log_{10} b^{e_{\rm min} - 1}\rceil$ |
`FLT_MIN_EXP` | `FLT_RADIX` の $n - 1$ 乗が`float`の正規化数として表現可能な最小の負の整数値 $n$。 上記モデルでは、$e_{\rm min}$ |
`DBL_MIN_EXP` | `FLT_RADIX` の $n - 1$ 乗が`double`の正規化数として表現可能な最小の負の整数値 $n$。 上記モデルでは、$e_{\rm min}$ |
`LDBL_MIN_EXP` | `FLT_RADIX` の $n - 1$ 乗が`long double`の正規化数として表現可能な最小の負の整数値 $n$。 上記モデルでは、$e_{\rm min}$ |

## 参照

- P0063R3 C++17 should refer to C11 instead of C99
- P0175R1 Synopses for the C library
- P3348R4 C++26 should refer to C23 not C17
  - C++26がC23を参照するようになり、`INFINITY`・`NAN`・`FLT_SNAN`・`DBL_SNAN`・`LDBL_SNAN`・`__STDC_VERSION_FLOAT_H__`が追加された。`DECIMAL_DIG`が非推奨となり、`FLT_HAS_SUBNORM`・`DBL_HAS_SUBNORM`・`LDBL_HAS_SUBNORM`が廃止予定 (obsolescent) となった