На этом шаге мы рассмотрим класс 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>.
Член класса | Описание | Константы 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 | Предельно малые значения обнаруживаются перед округлением |
На следующем шаге мы закончим изучение этого вопроса.