std::frexp, std::frexpf, std::frexpl
| Definido en el archivo de encabezado <cmath>
|
||
float frexp ( float arg, int* exp ); |
(1) | (constexpr since C++23) |
float frexpf( float arg, int* exp ); |
(2) | (desde C++11) (constexpr since C++23) |
double frexp ( double arg, int* exp ); |
(3) | (constexpr since C++23) |
long double frexp ( long double arg, int* exp ); |
(4) | (constexpr since C++23) |
long double frexpl( long double arg, int* exp ); |
(5) | (desde C++11) (constexpr since C++23) |
double frexp ( TipoEntero arg, int* exp ); |
(6) | (desde C++11) (constexpr since C++23) |
arg en una fracción normalizada y una potencia entera de dos. double).Parámetros
| arg | - | Valor de punto flotante. |
| exp | - | Puntero a valor entero en el que almacenar el exponente. |
Valor de retorno
Si arg es cero, devuelve cero y almacena cero en *exp.
De lo contrario (si arg no es cero), si no se producen errores, devuelve el valor x en el rango (-1;-0.5], [0.5; 1) y almacena un valor entero en *exp tal que x×2(*exp)
== arg.
Si el valor a almacenar en *exp está fuera del rango de int, el comportamiento no está especificado.
Manejo de errores
Esta función no está sujeta a ningún error especificado en math_errhandling.
Si la implementación admite la aritmética de punto flotante IEEE (IEC 60559):
- Si
arges +0, se devuelve +0 y se almacena0en*exp. - Si
arges -0, se devuelve -0 y se almacena0en*exp. - Si
arges +∞, se devuelve +∞, y se almacena un valor no especificado en*exp. - Si
arges -∞, se devuelve -∞, y se almacena un valor no especificado en*exp. - Si
arges NaN, se devuelve NaN, y se almacena un valor no especificado en*exp. - No se generan excepciones de punto flotante.
- Si FLT_RADIX es 2 (o una potencia de 2), el valor devuelto es exacto, se ignora el modo de redondeo actual.
Notas
En sistemas binarios (donde FLT_RADIX es 2), frexp puede implementarse como
{
*exp = (value == 0) ? 0 : (int)(1 + std::logb(value));
return std::scalbn(value, -(*exp));
}
La función std::frexp, junto con su dual std::ldexp, se puede usar para manipular la representación de un número de punto flotante sin manipulaciones directas de bits.
Ejemplo
Compara diferentes funciones de descomposición de punto flotante.
#include <iostream>
#include <cmath>
#include <limits>
int main()
{
double f = 123.45;
std::cout << "Dado el número " << f << " o " << std::hexfloat
<< f << std::defaultfloat << " en hexadecimal,\n";
double f3;
double f2 = std::modf(f, &f3);
std::cout << "modf() genera " << f3 << " + " << f2 << '\n';
int i;
f2 = std::frexp(f, &i);
std::cout << "frexp() genera " << f2 << " * 2^" << i << '\n';
i = std::ilogb(f);
std::cout << "logb()/ilogb() genera " << f/std::scalbn(1.0, i) << " * "
<< std::numeric_limits<double>::radix
<< "^" << std::ilogb(f) << '\n';
}
Posible salida:
Dado el número 123.45 o 0x1.edccccccccccdp+6 en hexadecimal,
modf() genera 123 + 0.45
frexp() genera 0.964453 * 2^7
logb()/ilogb() genera 1.92891 * 2^6
Véase también
(C++11)(C++11) |
Multiplica un número por 2 elevado a una potencia (función) |
(C++11)(C++11)(C++11) |
Extrae el exponente del número (función) |
(C++11)(C++11)(C++11) |
Extrae el exponente del número (función) |
(C++11)(C++11) |
Descompone un número en sus partes entera y fraccionaria (función) |
Documentación de C para frexp
| |