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
Défini dans l'en-tête <cmath>
int exponent
(1)
float scalbn ( float num, int exp ) ;

double scalbn ( double num, int exp ) ;

long double scalbn ( long double num, int exp ) ;
(depuis C++11)
(jusqu'à C++23)
constexpr /* floating-point-type */
scalbn ( /* floating-point-type */ num, int exp ) ;
(depuis C++23)
float scalbnf ( float num, int exp ) ;
(2) (depuis C++11)
(constexpr depuis C++23)
long double scalbnl ( long double num, int exp ) ;
(3) (depuis C++11)
(constexpr depuis C++23)
long exposant
(4)
float scalbln ( float num, long exp ) ;

double scalbln ( double num, long exp ) ;

long double scalbln ( long double num, long exp ) ;
(depuis C++11)
(jusqu'à C++23)
constexpr /* floating-point-type */
scalbln ( /* floating-point-type */ num, long exp ) ;
(depuis C++23)
float scalblnf ( float num, long exp ) ;
(5) (depuis C++11)
(constexpr depuis C++23)
long double scalblnl ( long double num, long exp ) ;
(6) (depuis C++11)
(constexpr depuis C++23)
Défini dans l'en-tête <cmath>
template < class Integer >
double scalbn ( Integer num, int exp ) ;
(A) (depuis C++11)
(constexpr depuis C++23)
template < class Integer >
double scalbln ( Integer num, long exp ) ;
(B) (depuis C++11)
(constexpr depuis C++23)
1-6) Multiplie une valeur à virgule flottante num par FLT_RADIX élevé à la puissance exp . La bibliothèque fournit des surcharges de std::scalbn et std::scalbln pour tous les types à virgule flottante non qualifiés cv comme type du paramètre num . (depuis C++23)
A,B) Des surcharges supplémentaires sont fournies pour tous les types entiers, qui sont traités comme double .

Table des matières

Paramètres

num - valeur à virgule flottante ou entière
exp - valeur entière

Valeur de retour

Si aucune erreur ne se produit, num multiplié par FLT_RADIX élevé à la puissance exp ( num×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 num vaut ±0, il est retourné inchangé.
  • Si num vaut ±∞, il est retourné inchangé.
  • Si exp vaut 0, alors num est retourné inchangé.
  • Si num est NaN, NaN est retourné.

Notes

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

Bien que std::scalbn et std::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.

Le nom de la fonction signifie « new scalb », où scalb était une ancienne fonction non standard dont le deuxième argument était de type flottant.

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

L'implémentation GNU ne définit pas errno indépendamment de math_errhandling .

Les surcharges supplémentaires ne sont pas tenues d'être fournies exactement sous la forme (A,B) . Elles doivent seulement être suffisantes pour garantir que pour leur argument num de type entier :

  • std :: scalbn ( num, exp ) a le même effet que std :: scalbn ( static_cast < double > ( num ) , exp ) .
  • std :: scalbln ( num, exp ) a le même effet que std :: scalbln ( static_cast < double > ( num ) , exp ) .

Exemple

#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)
              << " (minimum positive subnormal double)\n"
              << "scalbn(nextafter(1,0), 1024) = "
              << std::scalbn(std::nextafter(1,0), 1024)
              << " (largest finite double)\n";
    // special values
    std::cout << "scalbn(-0, 10) = " << std::scalbn(-0.0, 10) << '\n'
              << "scalbn(-Inf, -1) = " << std::scalbn(-INFINITY, -1) << '\n';
    // error handling
    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 raised\n";
}

Sortie possible :

scalbn(7, -4) = 0.4375
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
scalbn(-Inf, -1) = -inf
scalbn(1, 1024) = inf
    errno == ERANGE: Numerical result out of range
    FE_OVERFLOW raised

Voir aussi

(C++11) (C++11)
décompose un nombre en mantisse et exposant de base 2
(fonction)
(C++11) (C++11)
multiplie un nombre par 2 élevé à une puissance entière
(fonction)
Documentation C pour scalbn