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) |
longdouble frexp (longdouble arg, int* exp ); | (4) | (constexpr since C++23) |
longdouble frexpl(longdouble 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. Contenido |
[editar]Parámetros
arg | - | Valor de punto flotante. |
exp | - | Puntero a valor entero en el que almacenar el exponente. |
[editar]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.
[editar]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
arg
es +0, se devuelve +0 y se almacena0
en *exp. - Si
arg
es -0, se devuelve -0 y se almacena0
en *exp. - Si
arg
es +∞, se devuelve +∞, y se almacena un valor no especificado en *exp. - Si
arg
es -∞, se devuelve -∞, y se almacena un valor no especificado en *exp. - Si
arg
es 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.
[editar]Notas
En sistemas binarios (donde FLT_RADIX es 2
), frexp
puede implementarse como
{*exp =(value ==0)?0:(int)(1+std::logb(value));returnstd::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.
[editar]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
[editar]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 |