Вспомогательные средства. Класс numeric_limits

   
На этом шаге мы рассмотрим класс numeric_limits.

   
Обычно шаблоны применяются для реализации некой функциональности в любом типе. Однако шаблоны также могут использоваться
для определения общего интерфейса, реализуемого в типах, поддерживающих этот интерфейс. Для этой цели определяются
специализированные версии обобщенного шаблона. Ниже показано, как эта методика применяется в шаблоне numeric_limits.

  • Обобщенный шаблон задает числовые пределы по умолчанию для произвольного типа:
    namespace std {
      // Числовые пределы по умолчанию для произвольного типа 
      template <class T> 
      class numeric_limits { 
        public:
          // Специализация числовых пределов отсутствует 
          static const bool is_specialized = false;
          .  .  .  // Прочие члены класса, которые не имеют смысла 
                   // для обобщенных числовых пределов
      };
    }
    

       
    Обобщенный шаблон числовых пределов указывает лишь на то, что для типа Т числовые пределы не определены. Для этого
    переменной is_specialized присваивается значение false.

  • Специализированные версии шаблона определяют числовые пределы для всех числовых типов:
    namespace std {
      // Числовые пределы для int 
      template <> class numeric_limits<int> {
        public:
          // Да, для int существует специализация числовых пределов 
          static const bool is_specialized = true;
    
          static T min() throw() { 
            return -2147483648;
          }
    
          static T max() throw() { 
            return 2147483647;
          }
          static const int digits = 31;
          .   .   .
      };
    }
    

       
    На этот раз переменной ls_specialized присвоено значение true, а остальные члены класса используют числовые
    пределы конкретного типа (int в приведенном примере).

   
Обобщенный шаблон numeric_limits и его стандартные специализации содержатся в заголовочном файле <limits>.
Заголовок включает специализации для всех базовых типов, представляющих числовые значения:
bool, char, signed char, unsigned char, wchar_t, short, unsigned short, int, unsigned int, long, unsigned long, float, double и long double.
Кроме того, аналогичные специализации легко определяются для пользовательских числовых типов.

   
В таблице 1 перечислены все члены класса numeric_limits<> с краткими описаниями. В правом столбце приводятся
соответствующие константы С, определяемые в заголовочных файлах <climits>, <limits.h>, <cfloat> и <float.h>.

Таблица 1. Члены класса numeric_limits<>

Член класса Описание Константы C
is_specialized Тип поддерживает специализацию числовых пределов  
is_slgned Знаковый тип  
is_integer Целочисленный тип  
is_exact Вычисления производятся без ошибок округления (true для всех целочисленных типов)  
is_bounded Тип имеет конечный набор допустимых значений (true для всех встроенных типов)  
is_modulo Поддерживается сложение по модулю (суммирование двух положительных чисел может привести к меньшему результату)  
is_lec559 Тип соответствует стандартам IEC 559 и IEEE 754  
min() Минимальное конечное значение (минимальное нормализованное значение для вещественных типов с денормализацией; имеет смысл, если is_bounded || !is_signed) INT_MIN, FLT_MIN, CHAR_MIN, ...
max() Максимальное конечное значение (имеет смысл, если is_bounded) INT_MAX, FLT_MAX,...
digits Символьные, целочисленные типы - количество незнаковых битов; вещественные типы - количество цифр основания radix в мантиссе CHAR_BIT
digits() Количество десятичных цифр (имеет смысл, если is_bounded) FLT_DIG, ...
radix Целочисленные типы - основание системы счисления, использованной для представления (почти всегда 2); вещественные типы -
основание системы счисления, использованной для представления экспоненты
FLT_RADIX
min_exponent Минимальный отрицательный целый показатель степени с основанием radix FLT_MIN_EXP, ...
max_exponent Максимальный положительный целый показатель степени с основанием radix FLT_MAX_EXP,...
min_exponent10 Минимальный отрицательный целый показатель степени с основанием 10 FLT_MIN_10_EXP, ...
max_exponent10 Максимальный положительный целый показатель степени с основанием 10 FLT_MAX_10_EXP, ...
epsilon() Разность между 1 и минимальной величиной, большей 1 FLT_EPSILON,...
round_style Стиль округления  
round_error() Оценка максимальной ошибки округления (в соответствии со стандартом ISO/IEC 10967-1)  
has_infinity Признак наличия представления для положительной бесконечности  
infinity() Представление положительной бесконечности (если оно есть)  
has_quiet_NaN Признак наличия пассивного представления NaN ("не число")  
quiet_NaN Пассивное представление NaN  
has_signaling_NaN Признак наличия сигнального представления NaN  
signaling_NaN() Сигнальное представление NaN  
has_denorm Возможность представления денормализованных значений (с переменным количеством битов экспоненты)  
has_denorm_loss Потеря точности обнаруживается как потеря денормализации, а не как неточный результат  
denorm_min() Минимальное положительное денормализованное значение  
traps В типе реализован механизм "ловушек"  
tinyness_before Предельно малые значения обнаруживаются перед округлением  

   
На следующем шаге мы закончим изучение этого вопроса.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий