Espacios de nombres
Variantes
Acciones

std::scalbn, std::scalbnf, std::scalbnl, std::scalbln, std::scalblnf, std::scalblnl

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
scalbnscalbln
(C++11)(C++11)
(C++11)
(C++11)
(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       scalbn ( float x, int exp );
(1) (desde C++11)
(constexpr since C++23)
float       scalbnf( float x, int exp );
(2) (desde C++11)
(constexpr since C++23)
double      scalbn ( double x, int exp );
(3) (desde C++11)
(constexpr since C++23)
long double scalbn ( long double x, int exp );
(4) (desde C++11)
(constexpr since C++23)
long double scalbnl( long double x, int exp );
(5) (desde C++11)
(constexpr since C++23)
double      scalbn ( TipoEntero x, int exp );
(6) (desde C++11)
(constexpr since C++23)
float       scalbln ( float x, long exp );
(7) (desde C++11)
(constexpr since C++23)
float       scalblnf( float x, long exp );
(8) (desde C++11)
(constexpr since C++23)
double      scalbln ( double x, long exp );
(9) (desde C++11)
(constexpr since C++23)
long double scalbln ( long double x, long exp );
(10) (desde C++11)
(constexpr since C++23)
long double scalblnl( long double x, long exp );
(11) (desde C++11)
(constexpr since C++23)
double      scalbln ( TipoEntero x, long exp );
(12) (desde C++11)
(constexpr since C++23)
1-5,7-11) Multiplica un valor de punto flotante x por FLT_RADIX elevado a la potencia exp.
6,12) Un conjunto de sobrecargas o una plantilla de función que acepta un argumento de cualquier tipo entero. Equivalente a (3) o (9) (el argumento se convierte a double).

Contenido

[editar] Parámetros

x - Valor de punto flotante.
exp - Valor entero.

[editar] Valor de retorno

Si no se producen errores, se devuelve x multiplicado por FLT_RADIX a la potencia arg (x×FLT_RADIXexp
).

Si se produce un error de rango debido a desbordamiento, se devuelve ±HUGE_VAL, ±HUGE_VALF, o ±HUGE_VALL.

Si se produce un error de rango debido a subdesbordamiento, se devuelve el valor correcto (después del redondeo).

[editar] Manejo de errores

Los errores se informan como se especifica en math_errhandling.

Si la implementación admite la aritmética de punto flotante IEEE (IEC 60559):

  • A menos que se produzca un error de rango, nunca se genera FE_INEXACT (el resultado es exacto).
  • A menos que se produzca un error de rango, se ignora el modo de redondeo actual.
  • Si x es +0, se devuelve +0.
  • Si x es -0, se devuelve -0.
  • Si x es +∞, se devuelve +∞.
  • Si x es -∞, se devuelve -∞.
  • Si exp es 0, entonces se devuelve x sin modificar.
  • Si x es NaN, se devuelve NaN.

[editar] Notas

En sistemas binarios (donde FLT_RADIX es 2), std::scalbn es equivalente a std::ldexp.

Aunque std::scalbn y std::scalbln se especifican para realizar la operación de manera eficiente, en muchas implementaciones son menos eficientes que la multiplicación o división por una potencia de dos usando operadores aritméticos.

El nombre de la función significa "nueva scalb", donde scalb era una función no estándar más antigua cuyo segundo argumento tenía un tipo de punto flotante.

La función scalbln se proporciona porque el factor requerido para escalar desde el valor de punto flotante positivo más pequeño hasta el finito más grande puede ser mayor que 32767, el valor INT_MAX garantizado por el estándar. En particular, para long double de 80 bits, el factor es 32828.

La implementación de GNU no establece errno independientemente de math_errhandling.

[editar] Ejemplo

#include <iostream>
#include <cmath>
#include <cerrno>
#include <cstring>
#include <cfenv>
 
// #pragma STDC FENV_ACCESS ON
int main()
{
    std::cout << "scalbn(7, -4) = " << std::scalbn(7, -4) << '\n'
              << "scalbn(1, -1074) = " << std::scalbn(1, -1074)
              << " (double subnormal mínimo positivo)\n"
              << "scalbn(nextafter(1,0), 1024) = "
              << std::scalbn(std::nextafter(1,0), 1024)
              << " (double finito más grande)\n";
    // valores especiales
    std::cout << "scalbn(-0, 10) = " << std::scalbn(-0.0, 10) << '\n'
              << "scalbn(-Inf, -1) = " << std::scalbn(-INFINITY, -1) << '\n';
    // manejo de errores
    errno = 0;
    std::feclearexcept(FE_ALL_EXCEPT);
    std::cout << "scalbn(1, 1024) = " << std::scalbn(1, 1024) << '\n';
    if (errno == ERANGE)
        std::cout << "    errno == ERANGE: " << std::strerror(errno) << '\n';
    if (std::fetestexcept(FE_OVERFLOW))
        std::cout << "    Se generó FE_OVERFLOW\n";
}

Posible salida:

scalbn(7, -4) = 0.4375
scalbn(1, -1074) = 4.94066e-324 (double subnormal mínimo positivo)
scalbn(nextafter(1,0), 1024) = 1.79769e+308 (double finito más grande)
scalbn(-0, 10) = -0
scalbn(-Inf, -1) = -inf
scalbn(1, 1024) = inf
    errno == ERANGE: Resultado numérico fuera de rango
    Se generó FE_OVERFLOW

[editar] Véase también

(C++11)(C++11)
Descompone un número en mantisa y una potencia de 2
(función) [editar]
(C++11)(C++11)
Multiplica un número por 2 elevado a una potencia
(función) [editar]