21 Language support library [language.support]

21.3 Implementation properties [support.limits]

21.3.4 Class template numeric_­limits [numeric.limits]

numeric_­limits Шаблонный класс предоставляет программу на C ++ с информацией о различных свойствах репрезентации реализации языка арифметических типов.

namespace std {
  template<class T> class numeric_limits {
  public:
    static constexpr bool is_specialized = false;
    static constexpr T min() noexcept { return T(); }
    static constexpr T max() noexcept { return T(); }
    static constexpr T lowest() noexcept { return T(); }

    static constexpr int  digits = 0;
    static constexpr int  digits10 = 0;
    static constexpr int  max_digits10 = 0;
    static constexpr bool is_signed = false;
    static constexpr bool is_integer = false;
    static constexpr bool is_exact = false;
    static constexpr int  radix = 0;
    static constexpr T epsilon() noexcept { return T(); }
    static constexpr T round_error() noexcept { return T(); }

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

    static constexpr bool has_infinity = false;
    static constexpr bool has_quiet_NaN = false;
    static constexpr bool has_signaling_NaN = false;
    static constexpr float_denorm_style has_denorm = denorm_absent;
    static constexpr bool has_denorm_loss = false;
    static constexpr T infinity() noexcept { return T(); }
    static constexpr T quiet_NaN() noexcept { return T(); }
    static constexpr T signaling_NaN() noexcept { return T(); }
    static constexpr T denorm_min() noexcept { return T(); }

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

    static constexpr bool traps = false;
    static constexpr bool tinyness_before = false;
    static constexpr float_round_style round_style = round_toward_zero;
  };

  template<class T> class numeric_limits<const T>;
  template<class T> class numeric_limits<volatile T>;
  template<class T> class numeric_limits<const volatile T>;
}

Для всех членов, объявленных staticconstexpr в numeric_­limits шаблоне, специализации должны определять эти значения таким образом, чтобы их можно было использовать как постоянные выражения.

Вnumeric_­limits<T> шаблоне по умолчанию должны быть все элементы, но с 0 или false значениями.

Спецификации должны быть предоставлены для каждого арифметического типа, включая числа с плавающей запятой и целые числа bool. Член is_­specialized должен быть true для всех таких специальностей numeric_­limits.

Значение каждого члена специализации numeric_­limits неквалифицированного типа cv T должно быть равно значению соответствующего члена специализации неквалифицированного типаT.

Стандартные неарифметические типы, такие как complex<T>, не должны иметь специализаций.

21.3.4.1 numeric_­limits members [numeric.limits.members]

Каждая функция-член, определенная в этом подпункте, является signal-safe ([csignal.syn]).

static constexpr T min() noexcept;

Минимальное конечное значение.188

Для типов с плавающей запятой с субнормальными числами возвращает минимальное положительное нормализованное значение.

Имеет значение для всех специализаций, в которых is_­bounded != false, или is_­bounded == false && is_­signed == false.

static constexpr T max() noexcept;

Максимальное конечное значение.189

Имеет значение для всех специализаций, в которых is_­bounded != false.

static constexpr T lowest() noexcept;

Конечное значениеx такое, что не существует другого конечного значенияy гдеy < x.190

Имеет значение для всех специализаций, в которыхis_­bounded != false.

static constexpr int digits;

Количество radix цифр, которое можно представить без изменений.

Для целочисленных типов - количество битов без знака в представлении.

Для типов с плавающей запятой - количествоradix цифр в мантиссе.191

static constexpr int digits10;

Количество десятичных разрядов, которое может быть представлено без изменений.192

Имеет значение для всех специализаций, в которых is_­bounded != false.

static constexpr int max_digits10;

Количество десятичных разрядов, необходимое для того, чтобы всегда различать различающиеся значения.

Имеет значение для всех типов с плавающей запятой.

static constexpr bool is_signed;

true если тип подписан.

Имеет значение для всех специализаций.

static constexpr bool is_integer;

true если тип целочисленный.

Имеет значение для всех специализаций.

static constexpr bool is_exact;

true если тип использует точное представление. Все целочисленные типы являются точными, но не все точные типы являются целыми числами. Например, рациональные представления и представления с фиксированным показателем являются точными, но не целочисленными.

Имеет значение для всех специализаций.

static constexpr int radix;

Для типов с плавающей запятой указывает основание или основание системы счисления экспоненты (часто 2).193

Для целочисленных типов указывает основу представления.194

Имеет значение для всех специализаций.

static constexpr T epsilon() noexcept;

Машинный эпсилон: разница между 1 и наименьшим представимым значением больше 1.195

Имеет значение для всех типов с плавающей запятой.

static constexpr T round_error() noexcept;

Мера максимальной ошибки округления.196

static constexpr int min_exponent;

Минимальное отрицательное целое число, radix возведенное в степень на единицу меньше этого целого, является нормализованным числом с плавающей запятой.197

Имеет значение для всех типов с плавающей запятой.

static constexpr int min_exponent10;

Минимальное отрицательное целое число, при котором 10 в этой степени находится в диапазоне нормализованных чисел с плавающей запятой.198

Имеет значение для всех типов с плавающей запятой.

static constexpr int max_exponent;

Максимальное положительное целое число, radix возведенное в степень на единицу меньше этого целого, является представимым конечным числом с плавающей запятой.199

Имеет значение для всех типов с плавающей запятой.

static constexpr int max_exponent10;

Максимальное положительное целое число, такое, что 10 в этой степени находится в диапазоне представимых конечных чисел с плавающей запятой.200

Имеет значение для всех типов с плавающей запятой.

static constexpr bool has_infinity;

true если тип имеет представление для положительной бесконечности.

Имеет значение для всех типов с плавающей запятой.

Должен быть true для всех специализаций, в которых is_­iec559 != false.

static constexpr bool has_quiet_NaN;

true если тип имеет представление для тихого (не сигнализирующего) «Not a Number».201

Имеет значение для всех типов с плавающей запятой.

Должен быть true для всех специализаций, в которых is_­iec559 != false.

static constexpr bool has_signaling_NaN;

true если тип имеет представление для сигнализации «Not a Number».202

Имеет значение для всех типов с плавающей запятой.

Должен быть true для всех специализаций, в которых is_­iec559 != false.

static constexpr float_denorm_style has_denorm;

denorm_­present если тип допускает субнормальные значения (переменное количество битов экспоненты)203, denorm_­absent если тип не допускает субнормальных значений, и denorm_­indeterminate если он не определен во время компиляции, допускает ли тип субнормальные значения.

Имеет значение для всех типов с плавающей запятой.

static constexpr bool has_denorm_loss;

true если потеря точности определяется как потеря денормализации, а не как неточный результат.204

static constexpr T infinity() noexcept;

Представление положительной бесконечности, если доступно.205

Имеет значение для всех специализаций, для которых has_­infinity != false. Обязателен в специализациях, для которых is_­iec559 != false.

static constexpr T quiet_NaN() noexcept;

Представление тихого «Не числа», если доступно.206

Имеет значение для всех специализаций, для которых has_­quiet_­NaN != false. Обязателен в специализациях, для которых is_­iec559 != false.

static constexpr T signaling_NaN() noexcept;

Отображение сигнализации «Не число», если таковая имеется.207

Имеет значение для всех специализаций, для которых has_­signaling_­NaN != false. Обязателен в специализациях, для которых is_­iec559 != false.

static constexpr T denorm_min() noexcept;

Минимальное положительное субнормальное значение.208

Имеет значение для всех типов с плавающей запятой.

В специализациях, для которых has_­denorm == falseвозвращает минимальное положительное нормализованное значение.

static constexpr bool is_iec559;

true тогда и только тогда, когда тип соответствует ISO / IEC / IEEE 60559.209

Имеет значение для всех типов с плавающей запятой.

static constexpr bool is_bounded;

true если набор значений, представимых типом, конечно.210 [ Note: Все фундаментальные типы ([basic.fundamental]) ограничены. Этот член предназначенfalse для типов произвольной точности. ]end note

Имеет значение для всех специализаций.

static constexpr bool is_modulo;

true если тип по модулю.211 Тип определяется по модулю, если для любой операции с участием+,-или * со значениями этого типа, результат которых выходит за пределы диапазона [min(), max()], возвращаемое значение отличается от истинного значения на целое число, кратноеmax() - min() + 1.

[ Example: is_­modulo предназначенfalse для целочисленных типов со знаком ([basic.fundamental]), если реализация, как расширение этого международного стандарта, не определяет целочисленное переполнение со знаком для переноса. ]end example

Имеет значение для всех специализаций.

static constexpr bool traps;

true если при запуске программы существует значение типа, которое вызовет арифметическую операцию с использованием этого значения для перехвата.212

Имеет значение для всех специализаций.

static constexpr bool tinyness_before;

true если крошечность обнаружена до округления.213

Имеет значение для всех типов с плавающей запятой.

static constexpr float_round_style round_style;

Стиль округления для шрифта.214

Имеет значение для всех типов с плавающей запятой. Должны возвращаться специализации для целочисленных типов round_­toward_­zero.

ЭквивалентCHAR_­MIN,SHRT_­MIN, FLT_­MIN,DBL_­MINи т.д.

ЭквивалентCHAR_­MAX,SHRT_­MAX, FLT_­MAX,DBL_­MAXи т.д.

lowest() необходимо, потому что не все представления с плавающей запятой имеют наименьшее (наиболее отрицательное) значение, которое является отрицательным из наибольшего (наиболее положительного) конечного значения.

ЭквивалентFLT_­MANT_­DIG,DBL_­MANT_­DIG, LDBL_­MANT_­DIG.

ЭквивалентFLT_­DIG,DBL_­DIG, LDBL_­DIG.

ЭквивалентноFLT_­RADIX.

Различает типы с основанием, отличным от 2 (например, BCD).

ЭквивалентFLT_­EPSILON,DBL_­EPSILON,LDBL_­EPSILON.

Ошибка округления описана в разделе 5.2.4 LIA-1 и разделе C.5.2.4 «Обоснование» приложения C. - Округление и константы округления.

ЭквивалентFLT_­MIN_­EXP,DBL_­MIN_­EXP, LDBL_­MIN_­EXP.

Эквивалент FLT_­MIN_­10_­EXP,DBL_­MIN_­10_­EXP,LDBL_­MIN_­10_­EXP.

ЭквивалентFLT_­MAX_­EXP, DBL_­MAX_­EXP,LDBL_­MAX_­EXP.

Эквивалент FLT_­MAX_­10_­EXP,DBL_­MAX_­10_­EXP,LDBL_­MAX_­10_­EXP.

Требуется LIA-1.

Требуется LIA-1.

Требуется LIA-1.

См. ISO / IEC / IEEE 60559.

Требуется LIA-1.

Требуется LIA-1.

Требуется LIA-1.

Требуется LIA-1.

ISO / IEC / IEEE 60559: 2011 совпадает с IEEE 754-2008.

Требуется LIA-1.

Требуется LIA-1.

Требуется LIA-1.

См. ISO / IEC / IEEE 60559. Требуется LIA-1.

ЭквивалентноFLT_­ROUNDS. Требуется LIA-1.

21.3.4.2 numeric_­limits specializations [numeric.special]

Предусмотрены все участники для всех специальностей. Однако многие значения должны быть значимыми только при определенных условиях (например, epsilon() имеет смысл только в том случае, если is_­integer есть false). Любое значение, которое не является «значимым», должно быть установлено на 0 или false.

[Example:

namespace std {
  template<> class numeric_limits<float> {
  public:
    static constexpr bool is_specialized = true;

    static constexpr float min() noexcept { return 1.17549435E-38F; }
    static constexpr float max() noexcept { return 3.40282347E+38F; }
    static constexpr float lowest() noexcept { return -3.40282347E+38F; }

    static constexpr int digits   = 24;
    static constexpr int digits10 =  6;
    static constexpr int max_digits10 =  9;

    static constexpr bool is_signed  = true;
    static constexpr bool is_integer = false;
    static constexpr bool is_exact   = false;

    static constexpr int radix = 2;
    static constexpr float epsilon() noexcept     { return 1.19209290E-07F; }
    static constexpr float round_error() noexcept { return 0.5F; }

    static constexpr int min_exponent   = -125;
    static constexpr int min_exponent10 = - 37;
    static constexpr int max_exponent   = +128;
    static constexpr int max_exponent10 = + 38;

    static constexpr bool has_infinity             = true;
    static constexpr bool has_quiet_NaN            = true;
    static constexpr bool has_signaling_NaN        = true;
    static constexpr float_denorm_style has_denorm = denorm_absent;
    static constexpr bool has_denorm_loss          = false;

    static constexpr float infinity()      noexcept { return value; }
    static constexpr float quiet_NaN()     noexcept { return value; }
    static constexpr float signaling_NaN() noexcept { return value; }
    static constexpr float denorm_min()    noexcept { return min(); }

    static constexpr bool is_iec559  = true;
    static constexpr bool is_bounded = true;
    static constexpr bool is_modulo  = false;
    static constexpr bool traps      = true;
    static constexpr bool tinyness_before = true;

    static constexpr float_round_style round_style = round_to_nearest;
  };
}

end example]

Специализация bool предоставляется следующим образом:

namespace std {
   template<> class numeric_limits<bool> {
   public:
     static constexpr bool is_specialized = true;
     static constexpr bool min() noexcept { return false; }
     static constexpr bool max() noexcept { return true; }
     static constexpr bool lowest() noexcept { return false; }

     static constexpr int  digits = 1;
     static constexpr int  digits10 = 0;
     static constexpr int  max_digits10 = 0;

     static constexpr bool is_signed = false;
     static constexpr bool is_integer = true;
     static constexpr bool is_exact = true;
     static constexpr int  radix = 2;
     static constexpr bool epsilon() noexcept { return 0; }
     static constexpr bool round_error() noexcept { return 0; }

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

     static constexpr bool has_infinity = false;
     static constexpr bool has_quiet_NaN = false;
     static constexpr bool has_signaling_NaN = false;
     static constexpr float_denorm_style has_denorm = denorm_absent;
     static constexpr bool has_denorm_loss = false;
     static constexpr bool infinity() noexcept { return 0; }
     static constexpr bool quiet_NaN() noexcept { return 0; }
     static constexpr bool signaling_NaN() noexcept { return 0; }
     static constexpr bool denorm_min() noexcept { return 0; }

     static constexpr bool is_iec559 = false;
     static constexpr bool is_bounded = true;
     static constexpr bool is_modulo = false;

     static constexpr bool traps = false;
     static constexpr bool tinyness_before = false;
     static constexpr float_round_style round_style = round_toward_zero;
   };
}