std::numeric_limits<T>:: tinyness_before
|
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
- 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).
- 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
|
[static]
|
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) |