std::numeric_limits являється шаблонним класом, який дозволяє визначити обмеження системи відносно числових типів, на якій компілюється бібліотека. Оголошення класу приблизно виглядає наступним чином:
template <typename T> 
class numeric_limits 
{

  public :

    static const bool is_specialized = false ;
    
    static T min() throw() ;
    static T max() throw() ;
    
    static const int  digits = 0 ;
    static const int  digits10 = 0 ;
    static const bool is_signed = false ;
    static const bool is_integer = false ;
    static const bool is_exact = false ;
    
    static const int radix = 0 ;
    
    static T epsilon() throw() ;
    static T round_error() throw() ;

    static const int  min_exponent = 0 ;
    static const int  min_exponent10 = 0 ;
    static const int  max_exponent = 0 ;
    static const int  max_exponent10 = 0 ;

    static const bool has_infinity = false ;
    static const bool has_quiet_NaN = false ; 
    static const bool has_signaling_NaN = false ;

    static const float_denorm_style has_denorm = denorm_absent ;
    static const bool has_denorm_loss = false ;

    static T infinity() throw() ;
    static T quiet_NaN() throw() ;
    static T signaling_NaN() throw() ;
    static T denorm_min() throw() ;

    static const bool is_iec559 = false ;
    static const bool is_modulo = false ;
    static const bool is_bounded = false ;

    static const bool traps = false ;
    static const bool tinyness_before = false ;
    
    static const float_round_style round_style = round_toward_zero ;
    
} ;
Даний шаблонний клас має специфікації для кожного вбудованого числового типу. Даний клас не повинен бути спеціалізованим для будь-якого іншого типу. Щоб використовувати клас необхідно підключити файл limits наступним чином:
#include <limits> /* numeric_limits */

Опис полів і методів

static const bool is_specialized = false ;
Повертає значення true для усіх числових типів, для яких був створений спеціалізований клас.
static T min() throw() ;
Кінечне мінімальше значення типу.
static T max() throw() ;
Кінечне максимальне значення типу.
static const int  digits = 0 ;
Для цілих типів - кількість бітів, які число без знакового біту. Для дійсних чисел - кількість знаків мантиси.
static const int  digits10 = 0 ;
Кількість цифр, які можуть бути відображеними без змін. Еквівалент для  FLT_DIG, DBL_DIG або LDBL_DIG для дійсних типів.
static const bool is_signed = false ;
Містить true, коли тип може відображати знак числа.
static const bool is_integer = false ;
Містить значення true, якщо тип є цілочисельним.
static const bool is_exact = false ;
Містить true, якщо тип використовує точне представлення.
static const int radix = 0 ;
Для цілочисельних типів - число бази обрахунку (десяткова, шістнадцяткова). Для дійсних чисел - база обрахунку експоненти (еквівалент до FLT_RADIX).
static T epsilon() throw() ;
Епсилон числового типу системи, на якій була скомпільована бібліотека. Тобто різниця між одиницею і найбільшим числом, яке більше одиниці, що тип може вмістити (еквівалент FLT_EPSILON, DBL_EPSILON або LDBL_EPSILON).
static T round_error() throw() ;
Значення найбільшої помилки округлення.
static const int  min_exponent = 0 ;
Мінімальне негативне значення типу, яке при зведені radix в ступінь (min_exponent-1) генерує нормалізоване число з плаваючою мантисою. Еквівалент для  FLT_MIN_EXP, DBL_MIN_EXP або LDBL_MIN_EXP.
static const int  min_exponent10 = 0 ;
Мінімальне негативне значення типу, при якому число 10 зведене до степені даного числа генерує нормалізоване число з плаваючою мантисою. Еквівалент до FLT_MIN_10_EXP, DBL_MIN_10_EXP або LDBL_MIN_10_EXP для дійсних типів.
static const int  max_exponent = 0 ;
Максимальне позитивне значення типу, яке при зведені radix до ступеня (max_exponent-1) генерує кінечне число з плаваючою мантисою, яке можна представити. Еквівалент для  FLT_MAX_EXP, DBL_MAX_EXP або LDBL_MAX_EXP.
static const int  max_exponent10 = 0 ;
Максимальне ціле значення типу, при якому 10 зведена в дане число генерує нормалізоване число з плаваючою мантисою. Еквівалент до FLT_MAX_10_EXP, DBL_MAX_10_EXP або LDBL_MAX_10_EXP для дійсних типів.
static const bool has_infinity = false ;
Містить значення true, якщо тип може представляти значення позитивної безкінечності.
static const bool has_quiet_NaN = false ;
Містить значення true, якщо тип може представити без сигнальний "Not-a-Number".
static const bool has_signaling_NaN = false ;
Містить true, якщо тип може представити сигнальний "Not-a-Number".
static const float_denorm_style has_denorm = denorm_absent ;
Містить константу, яка визначає, чи тип може мати денормовані значення (значення з змінною кількістю експонентних бітів). Значення denorm_absent означає, що платворма не підтримує ненормовані значення. Значення denorm_present означає, що платформа підтримує денормовані значення типу. Значення denorm_indetermined, якщо не вдалось визначити під час компіляції.
static const bool has_denorm_loss = false ;
Містить значення true, якщо втрата точності являється скоріш причиною втрат зв’язаних з ненормованістю значь, ніж неточного результату.
static T infinity() throw() ;
Представлення позитивного безкінечного типу, якщо присутній у системі.
static T quiet_NaN() throw() ;
Значення, яке представляє без сигнальне значення "Not-a-Number", якщо таке присутнє в системі.
static T signaling_NaN() throw() ;
Представлення сигнального значення "Not-a-Number", якщо таке присутнє у системі.
static T denorm_min() throw() ;
Мінімальне позитивне ненормоване число. Для типів, які не підтримують ненормованих значень - повернене значення еквівалентне min().
static const bool is_iec559 = false ;
Містить значення true, якщо даний тип відповідає стандарту IEC-559/IEEE-754. Якщо тип підтримує стандарт IEC-559: значення констант has_infinity, has_quiet_NaN i has_signaling_NaN встановлені у значення true, а quiet_NaN і signaling_NaN повертають позитивне значення відмінне від нуля.
static const bool is_bounded = false ;
Містить true, якщо множина усіх значень, які може представити тип, являється кінечною.
static const bool is_modulo = false ;
Містить значення true, якщо тип дозволяє додати два позитивних числа, і отримати результат, який обгортається у третє число, яке являється меншим.
static const bool traps = false ;
Містить значення true, якщо тип підтримує зупинки.
static const bool tinyness_before = false ;
Містить значення true, якщо системи визначає малі числа перед їх округленням.
static const float_round_style round_style = round_toward_zero ;
Константа містить значення, яке характеризує метод округлення чисел системою. Значення round_toward_zero - якщо система округлює в сторону нуля. Значення round_to_nearest означає округлення числа до найближчого можливого значення типу. Значення round_toward_infinity означає округлення в сторону безкінечності. Значення round_toward_neg_infinity означає округлення в сторону негативної безкінечності. Значення round_indeterminate означає невизначеність методу округлення під час компілювання.

Приклад

Розглянемо приклад простої програми, яка виводить деякі з даних обмежень системи для різних типів.
#include <limits>
#include <iostream>
using namespace std ;

int main (int argc, char** argv)
{
  cout << "Числові обмеження: int; double" << endl 
    << "min():         " << numeric_limits<int>::min() << "; " 
     << numeric_limits<double>::min() << endl 
    << "max():         " << numeric_limits<int>::max() << "; " 
     << numeric_limits<double>::max() << endl 
    << "digits:        " << numeric_limits<int>::digits << "; " 
     << numeric_limits<double>::digits << endl 
    << "round_error(): " << numeric_limits<int>::round_error() << "; " 
     << numeric_limits<double>::round_error() << endl 
    << "has_infinity:  " << numeric_limits<int>::has_infinity << "; " 
     << numeric_limits<double>::has_infinity << endl 
    << "has_quiet_NaN: " << numeric_limits<int>::has_quiet_NaN << "; " 
     << numeric_limits<double>::has_quiet_NaN << endl 
    << "is_signed:     " << numeric_limits<int>::is_signed << "; " 
     << numeric_limits<double>::is_signed << endl 
    << "min_exponent:  " << numeric_limits<int>::min_exponent << "; " 
     << numeric_limits<double>::min_exponent << endl 
    << "max_exponent:  " << numeric_limits<int>::max_exponent << "; " 
     << numeric_limits<double>::max_exponent << endl
    << "radix:         " << numeric_limits<int>::radix << "; " 
     << numeric_limits<double>::radix << endl
    << "epsilon:       " << numeric_limits<int>::epsilon << "; " 
     << numeric_limits<double>::epsilon << endl
    << "is_exact:      " << numeric_limits<int>::is_exact << "; " 
     << numeric_limits<double>::is_exact << endl
    << "infinity():    " << numeric_limits<int>::infinity() << "; " 
     << numeric_limits<double>::infinity() << endl
    << "quiet_NaN():   " << numeric_limits<int>::quiet_NaN() << "; " 
     << numeric_limits<double>::quiet_NaN() << endl
    << "denorm_min():  " << numeric_limits<int>::denorm_min() << "; " 
     << numeric_limits<double>::denorm_min() << endl ;
  
  return 0 ; 
}
Вивід програми у термінал: cpp_std_numeric_limits_sample1-cxx_demo_program_output
Категорії: