Namespaces
Variants

std::numeric_limits<T>:: tinyness_before

From cppreference.net
Utilities library
static const bool tinyness_before ;
(hasta C++11)
static constexpr bool tinyness_before ;
(desde C++11)

El valor de std:: numeric_limits < T > :: tinyness_before es true para todos los tipos de punto flotante T que verifican los resultados de expresiones de punto flotante para subdesbordamiento antes del redondeo.

Contenidos

Especializaciones estándar

T valor de std:: numeric_limits < T > :: tinyness_before
/* no especializado */ false
bool false
char false
signed char false
unsigned char false
wchar_t false
char8_t (desde C++20) false
char16_t (desde C++11) false
char32_t (desde C++11) false
short false
unsigned short false
int false
unsigned int false
long false
unsigned long false
long long (desde C++11) false
unsigned long long (desde C++11) false
float definido por la implementación
double definido por la implementación
long double definido por la implementación

Notas

Las implementaciones compatibles con el estándar IEEE 754 de punto flotante deben detectar el desbordamiento inferior de punto flotante, y tienen dos situaciones alternativas donde esto puede hacerse

  1. El subdesbordamiento ocurre (y FE_UNDERFLOW puede ser activado) si un cálculo produce un resultado cuyo valor absoluto, calculado como si tanto el rango del exponente como la precisión fueran ilimitados, es menor que std:: numeric_limits < T > :: min ( ) . Tal implementación detecta la pequeñez antes del redondeo (por ejemplo, UltraSparc, POWER).
  2. El subdesbordamiento ocurre (y FE_UNDERFLOW puede ser activado) si después del redondeo del resultado al tipo de punto flotante objetivo (es decir, redondeando a std:: numeric_limits < T > :: digits bits), el valor absoluto del resultado es menor que std:: numeric_limits < T > :: min ( ) . Formalmente, el valor absoluto de un resultado distinto de cero calculado como si el rango del exponente fuera ilimitado es menor que std:: numeric_limits < T > :: min ( ) . Tal implementación detecta la pequeñez después del redondeo (por ejemplo, SuperSparc).

Ejemplo

La multiplicación del número subnormal más grande por el número un épsilon de máquina mayor que 1.0 da el valor minúsculo 0x0.fffffffffffff8p-1022 antes del redondeo, pero el valor normal 1p-1022 después del redondeo. La implementación utilizada para ejecutar esta prueba ( IBM Power7 ) detecta tinyness antes del redondeo.

#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';
}

Salida posible:

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

Véase también

identifica los tipos de punto flotante que detectan pérdida de precisión como pérdida por desnormalización en lugar de resultado inexacto
(constante de miembro estática pública)
[static]
identifica el estilo de desnormalización utilizado por el tipo de punto flotante
(constante de miembro estática pública)