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
Definiert in Header <math.h>
float scalbnf ( float arg, int exp ) ;
(1) (seit C99)
double scalbn ( double arg, int exp ) ;
(2) (seit C99)
long double scalbnl ( long double arg, int exp ) ;
(3) (seit C99)
Definiert in Header <tgmath.h>
#define scalbn( arg, exp )
(4) (seit C99)
Definiert in Header <math.h>
float scalblnf ( float arg, long exp ) ;
(5) (seit C99)
double scalbln ( double arg, long exp ) ;
(6) (seit C99)
long double scalblnl ( long double arg, long exp ) ;
(7) (seit C99)
Definiert in Header <tgmath.h>
#define scalbln( arg, exp )
(8) (seit C99)
1-3,5-7) Multipliziert einen Fließkommawert arg mit FLT_RADIX hoch exp .
4,8) Typgenerische Makros: Wenn arg den Typ long double hat, wird scalbnl oder scalblnl aufgerufen. Andernfalls, wenn arg einen Ganzzahltyp oder den Typ double hat, wird scalbn oder scalbln aufgerufen. Andernfalls wird scalbnf oder scalblnf aufgerufen, entsprechend.

Inhaltsverzeichnis

Parameter

arg - Gleitkommawert
exp - Ganzzahlwert

Rückgabewert

Wenn keine Fehler auftreten, arg multipliziert mit FLT_RADIX hoch exp ( arg×FLT_RADIX exp
) wird zurückgegeben.

Wenn ein Bereichsfehler aufgrund von Überlauf auftritt, ± HUGE_VAL , ±HUGE_VALF , oder ±HUGE_VALL wird zurückgegeben.

Wenn ein Bereichsfehler aufgrund von Unterlauf auftritt, wird das korrekte Ergebnis (nach Rundung) zurückgegeben.

Fehlerbehandlung

Fehler werden gemeldet, wie in math_errhandling festgelegt.

Wenn die Implementierung IEEE-Gleitkommaarithmetik (IEC 60559) unterstützt,

  • Sofern kein Bereichsfehler auftritt, FE_INEXACT wird niemals ausgelöst (das Ergebnis ist exakt).
  • Sofern kein Bereichsfehler auftritt, wird der aktuelle Rundungsmodus ignoriert.
  • Wenn arg ±0 ist, wird es unverändert zurückgegeben.
  • Wenn arg ±∞ ist, wird es unverändert zurückgegeben.
  • Wenn exp 0 ist, dann wird arg unverändert zurückgegeben.
  • Wenn arg NaN ist, wird NaN zurückgegeben.

Hinweise

Auf binären Systemen (wo FLT_RADIX gleich 2 ist), ist scalbn äquivalent zu ldexp .

Obwohl scalbn und scalbln spezifiziert sind, um die Operation effizient durchzuführen, sind sie in vielen Implementierungen weniger effizient als Multiplikation oder Division mit einer Zweierpotenz unter Verwendung arithmetischer Operatoren.

Die scalbln -Funktion wird bereitgestellt, weil der Faktor, der benötigt wird, um vom kleinsten positiven Gleitkommawert zum größten endlichen zu skalieren, größer sein kann als 32767 , der standardmäßig garantierte INT_MAX . Insbesondere für den 80-Bit- long double beträgt der Faktor 32828 .

Beispiel

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

Mögliche Ausgabe:

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

Referenzen

  • C23-Standard (ISO/IEC 9899:2024):
  • 7.12.6.13 Die scalbn-Funktionen (S.: TBD)
  • 7.25 Typgenerische Mathematik <tgmath.h> (S.: TBD)
  • F.10.3.13 Die scalbn-Funktionen (S.: TBD)
  • C17-Standard (ISO/IEC 9899:2018):
  • 7.12.6.13 Die scalbn-Funktionen (S.: TBD)
  • 7.25 Typgenerische Mathematik <tgmath.h> (S.: TBD)
  • F.10.3.13 Die scalbn-Funktionen (S.: TBD)
  • C11-Standard (ISO/IEC 9899:2011):
  • 7.12.6.13 Die scalbn-Funktionen (S: 247)
  • 7.25 Typgenerische Mathematik <tgmath.h> (S: 373-375)
  • F.10.3.13 Die scalbn-Funktionen (S: 523)
  • C99-Standard (ISO/IEC 9899:1999):
  • 7.12.6.13 Die scalbn-Funktionen (S. 228)
  • 7.22 Typgenerische Mathematik <tgmath.h> (S. 335-337)
  • F.9.3.13 Die scalbn-Funktionen (S. 460)

Siehe auch

zerlegt eine Zahl in Signifikand und Zweierpotenz 2
(Funktion)
multipliziert eine Zahl mit 2 hoch einer Potenz
(Funktion)