scalbn, scalbnf, scalbnl, scalbln, scalblnf, scalblnl
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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) |
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
argsin 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
|
(C99)
(C99)
|
descompone un número en significando y una potencia de
2
(función) |
|
(C99)
(C99)
|
multiplica un número por
2
elevado a una potencia
(función) |
|
C++ documentation
para
scalbn
|
|