Namespaces
Variants

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

From cppreference.net
Common mathematical functions
Nearest integer floating point operations
(C++11)
(C++11)
(C++11) (C++11) (C++11)
Floating point manipulation functions
scalbn scalbln
(C++11) (C++11)
(C++11)
(C++11)
Classification and comparison
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Types
(C++11)
(C++11)
(C++11)
Macro constants
Definido en el encabezado <cmath>
int exponente
(1)
float scalbn ( float num, int exp ) ;

double scalbn ( double num, int exp ) ;

long double scalbn ( long double num, int exp ) ;
(desde C++11)
(hasta C++23)
constexpr /* floating-point-type */
scalbn ( /* floating-point-type */ num, int exp ) ;
(desde C++23)
float scalbnf ( float num, int exp ) ;
(2) (desde C++11)
(constexpr desde C++23)
long double scalbnl ( long double num, int exp ) ;
(3) (desde C++11)
(constexpr desde C++23)
long exponente
(4)
float scalbln ( float num, long exp ) ;

double scalbln ( double num, long exp ) ;

long double scalbln ( long double num, long exp ) ;
(desde C++11)
(hasta C++23)
constexpr /* floating-point-type */
scalbln ( /* floating-point-type */ num, long exp ) ;
(desde C++23)
float scalblnf ( float num, long exp ) ;
(5) (desde C++11)
(constexpr desde C++23)
long double scalblnl ( long double num, long exp ) ;
(6) (desde C++11)
(constexpr desde C++23)
Definido en el encabezado <cmath>
template < class Integer >
double scalbn ( Integer num, int exp ) ;
(A) (desde C++11)
(constexpr desde C++23)
template < class Integer >
double scalbln ( Integer num, long exp ) ;
(B) (desde C++11)
(constexpr desde C++23)
1-6) Multiplica un valor de punto flotante num por FLT_RADIX elevado a la potencia exp . La biblioteca proporciona sobrecargas de std::scalbn y std::scalbln para todos los tipos de punto flotante sin calificación cv como el tipo del parámetro num . (desde C++23)
A,B) Se proporcionan sobrecargas adicionales para todos los tipos enteros, los cuales son tratados como double .

Contenidos

Parámetros

num - valor de punto flotante o entero
exp - valor entero

Valor de retorno

Si no ocurren errores, num multiplicado por FLT_RADIX elevado a la potencia de exp ( num×FLT_RADIX exp
) es devuelto.

Si ocurre un error de rango debido a desbordamiento, ±HUGE_VAL , ±HUGE_VALF , o ±HUGE_VALL es devuelto.

Si ocurre un error de rango debido a desbordamiento inferior, se devuelve el resultado correcto (después del redondeo).

Manejo de errores

Los errores se reportan como se especifica en math_errhandling .

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

  • A menos que ocurra un error de rango, FE_INEXACT nunca se activa (el resultado es exacto).
  • A menos que ocurra un error de rango, el modo de redondeo actual se ignora.
  • Si num es ±0, se devuelve sin modificaciones.
  • Si num es ±∞, se devuelve sin modificaciones.
  • Si exp es 0, entonces num se devuelve sin modificaciones.
  • Si num es NaN, se devuelve NaN.

Notas

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

Aunque std::scalbn y std::scalbln están especificados 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 utilizando operadores aritméticos.

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

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

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

Las sobrecargas adicionales no están obligadas a proporcionarse exactamente como (A,B) . Solo necesitan ser suficientes para garantizar que para su argumento num de tipo entero:

  • std :: scalbn ( num, exp ) tiene el mismo efecto que std :: scalbn ( static_cast < double > ( num ) , exp ) .
  • std :: scalbln ( num, exp ) tiene el mismo efecto que std :: scalbln ( static_cast < double > ( num ) , exp ) .

Ejemplo

#include <cerrno>
#include <cfenv>
#include <cmath>
#include <cstring>
#include <iostream>
// #pragma STDC FENV_ACCESS ON
int main()
{
    std::cout << "scalbn(7, -4) = " << std::scalbn(7, -4) << '\n'
              << "scalbn(1, -1074) = " << std::scalbn(1, -1074)
              << " (subnormal doble positivo mínimo)\n"
              << "scalbn(nextafter(1,0), 1024) = "
              << std::scalbn(std::nextafter(1,0), 1024)
              << " (doble 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 << "    FE_OVERFLOW activada\n";
}

Posible salida:

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

Véase también

(C++11) (C++11)
descompone un número en significando y exponente de base- 2
(función)
(C++11) (C++11)
multiplica un número por 2 elevado a una potencia entera
(función)
Documentación C para scalbn