Namespaces
Variants

std::numeric_limits<T>:: tinyness_before

From cppreference.net
Utilities library
static const bool tinyness_before ;
(до C++11)
static constexpr bool tinyness_before ;
(начиная с C++11)

Значение std:: numeric_limits < T > :: tinyness_before равно true для всех типов с плавающей точкой T , которые проверяют результаты вычислений с плавающей точкой на исчезновение порядка до округления.

Содержание

Стандартные специализации

T значение std:: numeric_limits < T > :: tinyness_before
/* non-specialized */ false
bool false
char false
signed char false
unsigned char false
wchar_t false
char8_t (начиная с C++20) false
char16_t (начиная с C++11) false
char32_t (начиная с C++11) false
short false
unsigned short false
int false
unsigned int false
long false
unsigned long false
long long (начиная с C++11) false
unsigned long long (начиная с C++11) false
float определяется реализацией
double определяется реализацией
long double определяется реализацией

Примечания

Соответствующие стандарту IEEE 754 реализации чисел с плавающей запятой обязаны обнаруживать исчезновение порядка (floating-point underflow), и предусматривают две альтернативные ситуации, когда это может быть выполнено

  1. Андерфлоу возникает (и FE_UNDERFLOW может быть возбуждён), если вычисление даёт результат, чьё абсолютное значение, вычисленное так, как если бы и диапазон экспоненты, и точность были неограниченными, меньше чем std:: numeric_limits < T > :: min ( ) . Такая реализация обнаруживает малость до округления (например, UltraSparc, POWER).
  2. Андерфлоу возникает (и FE_UNDERFLOW может быть возбуждён), если после округления результата к целевому типу с плавающей точкой (то есть, округления до std:: numeric_limits < T > :: digits битов), абсолютное значение результата меньше чем std:: numeric_limits < T > :: min ( ) . Формально, абсолютное значение ненулевого результата, вычисленного так, как если бы диапазон экспоненты был неограниченным, меньше чем std:: numeric_limits < T > :: min ( ) . Такая реализация обнаруживает малость после округления (например, SuperSparc).

Пример

Умножение наибольшего субнормального числа на число, на одно машинное эпсилон большее 1.0, дает крошечное значение 0x0.fffffffffffff8p-1022 до округления, но нормальное значение 1p-1022 после округления. Реализация, используемая для выполнения этого теста ( IBM Power7 ), обнаруживает крошечность до округления.

#include <iostream>
#include <limits>
#include <cmath>
#include <cfenv>
int main()
{
    std::cout << "Tinyness before: " << std::boolalpha
              << std::numeric_limits<double>::tinyness_before << '\n';
    double denorm_max = std::nextafter(std::numeric_limits<double>::min(), 0);
    double multiplier = 1 + std::numeric_limits<double>::epsilon();
    std::feclearexcept(FE_ALL_EXCEPT);
    double result = denorm_max * multiplier; // Underflow only if tinyness_before
    if (std::fetestexcept(FE_UNDERFLOW))
        std::cout << "Underflow detected\n";
    std::cout << std::hexfloat << denorm_max << " x " << multiplier  <<  " = "
              << result << '\n';
}

Возможный вывод:

Tinyness before: true
Underflow detected
0xf.ffffffffffffp-1030 x 0x1.0000000000001p+0 = 0x1p-1022

Смотрите также

идентифицирует типы с плавающей точкой, которые обнаруживают потерю точности как потерю денормализации, а не как неточный результат
(публичная статическая константа-член)
[static]
идентифицирует стиль денормализации, используемый типом с плавающей точкой
(публичная статическая константа-член)