Вспомогательные средства. Класс 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_indeterminateHe опредепено

Таблица 2. Стиль денормализации в numeric_limits<>

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

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



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

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