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
Défini dans l'en-tête <math.h>
float scalbnf ( float arg, int exp ) ;
(1) (depuis C99)
double scalbn ( double arg, int exp ) ;
(2) (depuis C99)
long double scalbnl ( long double arg, int exp ) ;
(3) (depuis C99)
Défini dans l'en-tête <tgmath.h>
#define scalbn( arg, exp )
(4) (depuis C99)
Défini dans l'en-tête <math.h>
float scalblnf ( float arg, long exp ) ;
(5) (depuis C99)
double scalbln ( double arg, long exp ) ;
(6) (depuis C99)
long double scalblnl ( long double arg, long exp ) ;
(7) (depuis C99)
Défini dans l'en-tête <tgmath.h>
#define scalbln( arg, exp )
(8) (depuis C99)
1-3,5-7) Multiplie une valeur à virgule flottante arg par FLT_RADIX élevé à la puissance exp .
4,8) Macros génériques au type : Si arg a le type long double , scalbnl ou scalblnl est appelé. Sinon, si arg a un type entier ou le type double , scalbn ou scalbln est appelé. Sinon, scalbnf ou scalblnf est appelé, respectivement.

Table des matières

Paramètres

arg - valeur à virgule flottante
exp - valeur entière

Valeur de retour

Si aucune erreur ne se produit, arg multiplié par FLT_RADIX à la puissance de exp ( arg×FLT_RADIX exp
) est retourné.

Si une erreur de plage due à un dépassement de capacité se produit, ± HUGE_VAL , ±HUGE_VALF , ou ±HUGE_VALL est renvoyé.

Si une erreur de plage due à un dépassement inférieur se produit, le résultat correct (après arrondi) est retourné.

Gestion des erreurs

Les erreurs sont signalées comme spécifié dans math_errhandling .

Si l'implémentation prend en charge l'arithmétique à virgule flottante IEEE (IEC 60559),

  • Sauf en cas d'erreur de plage, FE_INEXACT n'est jamais déclenché (le résultat est exact).
  • Sauf en cas d'erreur de plage, le mode d'arrondi actuel est ignoré.
  • Si arg est ±0, il est retourné, non modifié.
  • Si arg est ±∞, il est retourné, non modifié.
  • Si exp est 0, alors arg est retourné, non modifié.
  • Si arg est NaN, NaN est retourné.

Notes

Sur les systèmes binaires (où FLT_RADIX est 2 ), scalbn est équivalent à ldexp .

Bien que scalbn et scalbln soient conçus pour effectuer l'opération efficacement, dans de nombreuses implémentations ils sont moins efficaces qu'une multiplication ou division par une puissance de deux utilisant les opérateurs arithmétiques.

La fonction scalbln est fournie car le facteur nécessaire pour passer de la plus petite valeur positive en virgule flottante à la plus grande valeur finie peut être supérieur à 32767 , la valeur garantie par la norme pour INT_MAX . En particulier, pour le long double 80 bits, le facteur est 32828 .

Exemple

#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");
}

Sortie possible :

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

Références

  • Norme C23 (ISO/CEI 9899:2024) :
  • 7.12.6.13 Les fonctions scalbn (p: TBD)
  • 7.25 Mathématiques génériques de type <tgmath.h> (p: TBD)
  • F.10.3.13 Les fonctions scalbn (p: TBD)
  • Norme C17 (ISO/CEI 9899:2018) :
  • 7.12.6.13 Les fonctions scalbn (p: TBD)
  • 7.25 Mathématiques génériques <tgmath.h> (p: TBD)
  • F.10.3.13 Les fonctions scalbn (p: TBD)
  • Norme C11 (ISO/CEI 9899:2011) :
  • 7.12.6.13 Les fonctions scalbn (p: 247)
  • 7.25 Mathématiques génériques de type <tgmath.h> (p: 373-375)
  • F.10.3.13 Les fonctions scalbn (p: 523)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 7.12.6.13 Les fonctions scalbn (p: 228)
  • 7.22 Mathématiques génériques de type <tgmath.h> (p: 335-337)
  • F.9.3.13 Les fonctions scalbn (p: 460)

Voir aussi

décompose un nombre en mantisse et puissance de 2
(fonction)
multiplie un nombre par 2 élevé à une puissance
(fonction)