Namespaces
Variants

scalbn, scalbnf, scalbnl, scalbln, scalblnf, scalblnl

From cppreference.net
< c ‎ | numeric ‎ | math
Common mathematical functions
Functions
Basic operations
(C99)
(C99)
(C99)
(C99) (C99) (C99) (C23)
Maximum/minimum operations
Exponential functions
Power functions
Trigonometric and hyperbolic functions
Nearest integer floating-point
(C99) (C99) (C99)
(C23) (C23) (C23) (C23)
Floating-point manipulation
scalbn scalbln
(C99) (C99)
(C99) (C23)
(C99)
Narrowing operations
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
Quantum and quantum exponent
Decimal re-encoding functions
Total order and payload functions
Classification
Error and gamma functions
(C99)
(C99)
(C99)
(C99)
Types
Macro constants
Special floating-point values
Arguments and return values
Error handling
Fast operation indicators
Definido en el encabezado <math.h>
float scalbnf ( float arg, int exp ) ;
(1) (desde C99)
double scalbn ( double arg, int exp ) ;
(2) (desde C99)
long double scalbnl ( long double arg, int exp ) ;
(3) (desde C99)
Definido en el encabezado <tgmath.h>
#define scalbn( arg, exp )
(4) (desde C99)
Definido en el encabezado <math.h>
float scalblnf ( float arg, long exp ) ;
(5) (desde C99)
double scalbln ( double arg, long exp ) ;
(6) (desde C99)
long double scalblnl ( long double arg, long exp ) ;
(7) (desde C99)
Definido en el encabezado <tgmath.h>
#define scalbln( arg, exp )
(8) (desde C99)
1-3,5-7) Multiplica un valor de punto flotante arg por FLT_RADIX elevado a la potencia exp .
4,8) Macros genéricas de tipos: Si arg tiene tipo long double , scalbnl o scalblnl es llamado. De lo contrario, si arg tiene tipo entero o el tipo double , scalbn o scalbln es llamado. De lo contrario, scalbnf o scalblnf es llamado, respectivamente.

Contenidos

Parámetros

arg - valor de punto flotante
exp - valor entero

Valor de retorno

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

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, se ignora el modo de redondeo actual .
  • Si arg es ±0, se devuelve sin modificaciones.
  • Si arg es ±∞, se devuelve sin modificaciones.
  • Si exp es 0, entonces se devuelve arg sin modificaciones.
  • Si arg es NaN, se devuelve NaN.

Notas

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

Aunque scalbn y 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.

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 INT_MAX garantizado por el estándar. En particular, para el long double de 80 bits, el factor es 32828 .

Ejemplo

#include <errno.h>
#include <fenv.h>
#include <float.h>
#include <math.h>
#include <stdio.h>
// #pragma STDC FENV_ACCESS ON
int main(void)
{
    printf("scalbn(7, -4) = %f\n", scalbn(7, -4));
    printf("scalbn(1, -1074) = %g (minimum positive subnormal double)\n",
            scalbn(1, -1074));
    printf("scalbn(nextafter(1,0), 1024) = %g (largest finite double)\n",
            scalbn(nextafter(1,0), 1024));
    // special values
    printf("scalbn(-0, 10) = %f\n", scalbn(-0.0, 10));
    printf("scalbn(-Inf, -1) = %f\n", scalbn(-INFINITY, -1));
    // error handling
    errno = 0; feclearexcept(FE_ALL_EXCEPT);
    printf("scalbn(1, 1024) = %f\n", scalbn(1, 1024));
    if (errno == ERANGE)
        perror("    errno == ERANGE");
    if (fetestexcept(FE_OVERFLOW))
        puts("    FE_OVERFLOW raised");
}

Salida posible:

scalbn(7, -4) = 0.437500
scalbn(1, -1074) = 4.94066e-324 (minimum positive subnormal double)
scalbn(nextafter(1,0), 1024) = 1.79769e+308 (largest finite double)
scalbn(-0, 10) = -0.000000
scalbn(-Inf, -1) = -inf
scalbn(1, 1024) = inf
    errno == ERANGE: Numerical result out of range
    FE_OVERFLOW raised

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 7.12.6.13 Las funciones scalbn (p: TBD)
  • 7.25 Matemáticas genéricas de tipos <tgmath.h> (p: TBD)
  • F.10.3.13 Las funciones scalbn (p: TBD)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.12.6.13 Las funciones scalbn (p: TBD)
  • 7.25 Matemáticas genéricas de tipos <tgmath.h> (p: TBD)
  • F.10.3.13 Las funciones scalbn (p: TBD)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.12.6.13 Las funciones scalbn (p: 247)
  • 7.25 Matemáticas genéricas de tipo <tgmath.h> (p: 373-375)
  • F.10.3.13 Las funciones scalbn (p: 523)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.12.6.13 Las funciones scalbn (p: 228)
  • 7.22 Matemáticas genéricas de tipo <tgmath.h> (p: 335-337)
  • F.9.3.13 Las funciones scalbn (p: 460)

Véase también

descompone un número en significando y una potencia de 2
(función)
multiplica un número por 2 elevado a una potencia
(función)