Namensräume
Varianten
Aktionen

scalbn, scalbnf, scalbnl, scalbln, scalblnf, scalblnl

Von cppreference.com
< c‎ | numerik‎ | math
 
 
 
Allgemeine mathematische Funktionen
Funktionen
Grundlegende Operationen
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
Maximum/Minimum-Operationen
(C99)
(C99)
Exponentialfunktionen
(C23)
(C99)
(C99)
(C23)
(C23)

(C99)
(C99)(C23)
(C23)
(C23)
Potenzfunktionen
(C99)
(C23)
(C23)

(C99)
(C23)
(C23)
Trigonometrische und hyperbolische Funktionen
(C23)
(C23)
(C23)
(C23)
(C99)
(C99)
(C99)
Nächste ganze Gleitkommazahlen
(C99)(C99)(C99)
(C99)

(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
Gleitkomma-Manipulation
scalbnscalbln
(C99)(C99)
(C99)(C23)
(C99)
Verengende Operationen
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
Quanten- und Quantenexponent-Funktionen
Dezimal-Neu-Kodierungsfunktionen
Gesamtordnung und Payload-Funktionen
Klassifizierung
(C99)
(C99)
(C99)
(C23)
Fehler- und Gammafunktionen
(C99)
(C99)
(C99)
(C99)
Typen
Makrokonstanten
Spezielle Gleitkommawerte
(C99)(C23)
Argumente und Rückgabewerte
Fehlerbehandlung
Schnelle Operationsanzeigen
 
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 Gleitkommawert arg mit FLT_RADIX hoch die Potenz exp.
4,8) Typ-generische 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 entsprechend scalbnf oder scalblnf aufgerufen.

Inhalt

[edit] Parameter

arg - Gleitkommawert
exp - ganzzahliger Wert

[edit] Rückgabewert

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

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

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

[edit] Fehlerbehandlung

Fehler werden wie in math_errhandling angegeben gemeldet.

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

  • Sofern kein Bereichsfehler auftritt, wird FE_INEXACT 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.

[edit] Hinweise

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

Obwohl für scalbn und scalbln angegeben ist, dass sie die Operation effizient ausführen, sind sie in vielen Implementierungen weniger effizient als die Multiplikation oder Division mit einer Zweierpotenz mittels arithmetischer Operatoren.

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

[edit] 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

[edit] Referenzen

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

[edit] Siehe auch

teilt eine Zahl in Mantisse und Potenz von 2 auf
(Funktion) [bearbeiten]
multipliziert eine Zahl mit 2 hoch eine Potenz
(Funktion) [bearbeiten]
C++ Dokumentation für scalbn