最終更新日時: 2023年06月07日 18時26分38秒 (JST)
yoh が更新

履歴 編集

class template
<limits>

# std::numeric_limits

    namespace std {
      template <class T> class numeric_limits;

      template<> class numeric_limits<bool>;
      template<> class numeric_limits<char>;
      template<> class numeric_limits<signed char>;
      template<> class numeric_limits<unsigned char>;
      template<> class numeric_limits<char8_t>;  // C++20から追加
      template<> class numeric_limits<char16_t>; // C++11から追加
      template<> class numeric_limits<char32_t>; // C++11から追加
      template<> class numeric_limits<wchar_t>;

      template<> class numeric_limits<short>;
      template<> class numeric_limits<int>;
      template<> class numeric_limits<long>;
      template<> class numeric_limits<long long>; // C++11から追加
      template<> class numeric_limits<unsigned short>;
      template<> class numeric_limits<unsigned int>;
      template<> class numeric_limits<unsigned long>;
      template<> class numeric_limits<unsigned long long>; // C++11から追加

      template<> class numeric_limits<float>;
      template<> class numeric_limits<double>;
      template<> class numeric_limits<long double>;

      template <class T> class numeric_limits<const T>;          // C++11から追加
      template <class T> class numeric_limits<volatile T>;       // C++11から追加
      template <class T> class numeric_limits<const volatile T>; // C++11から追加
    }

`std::numeric_limits`クラスは以下の特徴を持つ：

- 実装が提供する算術型の性質を提供する
- 浮動小数点型、整数型、`bool`型について特殊化が提供され、`is_specialized=true`になる
- このクラスのメンバは全て `static constexpr` として定義されているため、定数式として使いやすい (C++11)
- `std::complex`のような非算術型については特殊化は提供されない
- CV修飾された型をテンプレート引数として指定した場合、CV修飾されていない型を指定した場合と同じになる (C++11)

静的メンバ | 性質 | 対応バージョン
--- | --- | ---
`min()` | 最小値を返す。 浮動小数点型については最小の正の正規化数を返す。 |
`max()` | 最大値を返す。 |
`lowest()` | 最小値を返す。 | C++11
`digits` | 基数 radix において表現できる桁数を示す。 整数型であれば、符号ビット以外のビット数である。 |
`digits10` | 10進数において表現できる桁数を示す。 |
`max_digits10` | 浮動小数点数の10進数表現における正確さを損なわない最大の桁数を示す | C++11
`is_signed` | 符号付き型かどうかを判定する |
`is_integer` | 整数型かどうかを判定する |
`is_exact` | 型が正確かどうかを判定する |
`radix` | `digits`を表現する基数を示す |
`epsilon()` | 機械イプシロン。1より大きい数の中で最小の値と1との差。 |
`round_error()` | 最大の丸め誤差。 |
`min_exponent` | 指数下限 |
`min_exponent10` | 10進指数下限 |
`max_exponent` | 指数上限 |
`max_exponent10` | 10進指数上限 |
`has_infinity` | 正の無限表現を持っているかを判定する |
`has_quiet_NaN` | シグナルを発生させないNaNを持っているかを判定する |
`has_signaling_NaN` | シグナルを発生させるNaNを持っているかを判定する |
`has_denorm` | 非正規化数のサポート状況を判定する | C++23で非推奨
`has_denorm_loss` | 精度の損失が非正規化数によるものかを判定する | C++23で非推奨
`infinity()` | 正の無限表現を取得する |
`quiet_NaN()` | シグナルを発生させないNaNを取得する |
`signaling_NaN()` | シグナルを発生させるNaNを取得する |
`denorm_min()` | 最小の非正規化数を取得する |
`is_iec559` | IEC 559標準に準拠しているかを判定する |
`is_bounded` | 値のなす集合が有限であるかを判定する |
`is_modulo` | 常に合同関係にある型かを判定する |
`traps` | トラップが実装されている型かを判定する |
`tinyness_before` | 丸めが行われる前に小さな値になることを検出できるかを判定する |
`round_style` | 丸めスタイルを取得する |

## 参照

- N2114 `long long` Goes to the Library, Revision 1
- LWG Issue 559. `numeric_limits<const T>`
- P2614R2 Deprecate `numeric_limits::has_denorm`