Шаг 75.
Библиотека STL.
Вспомогательные средства. Класс numeric_limits (окончание)

    На этом шаге мы закончим изучение класса numeric_limits.

    Ниже приведен один из вариантов полной специализации числовых пределов для зависимого от платформы типа float. Кроме того, в нем приведены точные сигнатуры членов.

namespace std {
  template<> class numenc_limits<float> { 
    publiс:
    // Да. для float существует специализация числовых пределов 
    static const bool is_specialized = true;
    inline static float min() throw() { 
      return 1.17549435E-38F;
    } 

    inline static float max() throw() { 
      return 3.40282347E+38F;
    }

    static const int digits = 24:
    static const int digits10 = 6:
    static const bool is_signed = true;
    static const bool is_integer = false:
    static const bool is_exact = false;
    static const bool is_bounded = true;
    static const bool is_imodulo = false;
    static const bool is_iec559 = true;

    static const int radix = 2;

    inline static float epsilon() throw() {
      return 1.19209290E-07F;
    }

    static const float_round_style round_style
      = round_to_nearest; 
    inline static float round_error() throw() {
      return 0.5F;
    }

    static const int min exponent = -125; 
    static const int max_exponent = +128; 
    static const int min_exponent10 = -37; 
    static const int max_exponent10 = +38;

    static const bool has_nfinity = true;
    inline static float infinity() throw() { return ...; }
    static const bool has_quiet_NaN = true;
    inline static float quiet_NaN() throw() { return ...; }
    static const bool has_signaling_NaN = true;
    inline static float signaling_NaN() throw() { return ...; }
    static const float_denorm_style has_denorm = denorm_absent;
    static const bool has_denorm_loss = false;
    inline static float denorm_min() throw() { return min(); }

    static const bool traps = true;
    static const bool tinyness_before = true;
  };
}

    Обратите внимание: все переменные класса объявлены статическими и константными, чтобы их значения могли определяться на стадии компиляции. В некоторых реализациях значения, возвращаемые функциями, не удается определить на стадии компиляции. Например, при выполнении кода на разных процессорах вещественные числа могут иметь разные значения.

    Значения round_style перечислены в таблице 1, а значения has_denorm - в таблице 2. К сожалению, переменная has_denorm не называется denorm_style, что выглядело бы более логично. Это произошло из-за того, что на поздней стадии стандартизации логический тип был заменен перечисляемым. Тем не менее переменная has_denorm может использоваться в логическом контексте, потому что в соответствии со стандартом значение denorm_absent равно 0 (эквивалент false), a denorm_present и denorm_indeterminate равны соответственно 1 и -1 (оба значения эквивалентны true). Следовательно, has_denorm может интерпретироваться как логический признак, указывающий, допускает ли данный тип денормализованные значения.

Таблица 1. Стили округления в numeric_limits<>
Стиль Описание
round_toward_zero Округление в направлении нуля
round_to_nearest Округление до ближайшего представимого значения
round_toward_infinity Округление в направлении положительной бесконечности
round_toward_neg_infinity Округление в направлении отрицательной бесконечности
round_indeterminate He опредепено

Таблица 2. Стиль денормализации в numeric_limits<>
Стиль денормализации Описание
denorm_absent Тип не допускает денормализованные значения
denorm_present Тип допускает денормализацию до ближайшего представимого значения
denorm_indeterminate He определено

    На следующем шаге мы приведем пример использования класса numeric_limits.




Предыдущий шаг Содержание Следующий шаг