Espacios de nombres
Variantes
Acciones

std::frexp, std::frexpf, std::frexpl

De cppreference.com
< cpp‎ | numeric‎ | math
 
 
 
Funciones matemáticas comunes
Funciones
Operaciones básicas
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
Funciones exponenciales
(C++11)
(C++11)
(C++11)
(C++11)
Funciones de potencias
(C++11)
(C++11)
Funciones trigonométricas e hiperbólicas
(C++11)
(C++11)
(C++11)
Funciones de error y gamma
(C++11)
(C++11)
(C++11)
(C++11)
Operaciones de punto flotante del entero más cercano
(C++11)(C++11)(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
Funciones de manipulación de punto flotante
(C++11)(C++11)
(C++11)
(C++11)
frexp
(C++11)(C++11)
(C++11)
Clasificación/comparación
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Constantes de macro
(C++11)(C++11)(C++11)(C++11)(C++11)
 
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)
1-5) Descompone el valor de punto flotante dado arg en una fracción normalizada y una potencia entera de dos.
6) Un conjunto de sobrecargas o una plantilla de función que acepta un argumento de cualquier tipo entero. Equivalente a (3) (el argumento se convierte a double).

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 almacena 0 en *exp.
  • Si arg es -0, se devuelve -0 y se almacena 0 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));
    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.

[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) [editar]
(C++11)(C++11)(C++11)
Extrae el exponente del número
(función) [editar]
(C++11)(C++11)(C++11)
Extrae el exponente del número
(función) [editar]
(C++11)(C++11)
Descompone un número en sus partes entera y fraccionaria
(función) [editar]