ldexp, ldexpf, ldexpl
| Definiert in Header <math.h> |
||
| float ldexpf( float arg, int exp ); |
(1) | (seit C99) |
| double ldexp( double arg, int exp ); |
(2) | |
| long double ldexpl( long double arg, int exp ); |
(3) | (seit C99) |
| Definiert in Header <tgmath.h> |
||
| #define ldexp( arg, exp ) |
(4) | (seit C99) |
ldexpl aufgerufen. Andernfalls, wenn arg vom Ganzzahltyp oder vom Typ double ist, wird ldexp aufgerufen. Andernfalls wird ldexpf aufgerufen.Inhalt |
[bearbeiten] Parameter
| arg | - | Gleitkommawert |
| exp | - | ganzzahliger Wert |
[bearbeiten] Rückgabewert
Wenn keine Fehler auftreten, wird arg multipliziert mit 2 hoch die Potenz exp (arg×2exp
) 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.
[bearbeiten] 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, wird arg unverändert zurückgegeben.
- Wenn arg NaN ist, wird NaN zurückgegeben.
[bearbeiten] Hinweise
Auf binären Systemen (bei denen FLT_RADIX 2 ist), ist ldexp äquivalent zu scalbn.
Die Funktion ldexp ("load exponent"), zusammen mit ihrem Dual, frexp, kann verwendet werden, um die Darstellung einer Fließkommazahl zu manipulieren, ohne direkte Bitmanipulationen durchzuführen.
Auf vielen Implementierungen ist ldexp weniger effizient als Multiplikation oder Division durch eine Zweierpotenz unter Verwendung von arithmetischen Operatoren.
[bearbeiten] 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("ldexp(7, -4) = %f\n", ldexp(7, -4)); printf("ldexp(1, -1074) = %g (minimum positive subnormal double)\n", ldexp(1, -1074)); printf("ldexp(nextafter(1,0), 1024) = %g (largest finite double)\n", ldexp(nextafter(1,0), 1024)); // special values printf("ldexp(-0, 10) = %f\n", ldexp(-0.0, 10)); printf("ldexp(-Inf, -1) = %f\n", ldexp(-INFINITY, -1)); // error handling errno = 0; feclearexcept(FE_ALL_EXCEPT); printf("ldexp(1, 1024) = %f\n", ldexp(1, 1024)); if (errno == ERANGE) perror(" errno == ERANGE"); if (fetestexcept(FE_OVERFLOW)) puts(" FE_OVERFLOW raised"); }
Mögliche Ausgabe
ldexp(7, -4) = 0.437500
ldexp(1, -1074) = 4.94066e-324 (minimum positive subnormal double)
ldexp(nextafter(1,0), 1024) = 1.79769e+308 (largest finite double)
ldexp(-0, 10) = -0.000000
ldexp(-Inf, -1) = -inf
ldexp(1, 1024) = inf
errno == ERANGE: Numerical result out of range
FE_OVERFLOW raised[bearbeiten] Referenzen
- C23-Standard (ISO/IEC 9899:2024)
- 7.12.6.6 Die ldexp-Funktionen (S. TBD)
- 7.25 Typ-generische Mathematik <tgmath.h> (S. TBD)
- F.10.3.6 Die ldexp-Funktionen (S. TBD)
- C17-Standard (ISO/IEC 9899:2018)
- 7.12.6.6 Die ldexp-Funktionen (S. TBD)
- 7.25 Typ-generische Mathematik <tgmath.h> (S. TBD)
- F.10.3.6 Die ldexp-Funktionen (S. TBD)
- C11-Standard (ISO/IEC 9899:2011)
- 7.12.6.6 Die ldexp-Funktionen (S. 244)
- 7.25 Typ-generische Mathematik <tgmath.h> (S. 373-375)
- F.10.3.6 Die ldexp-Funktionen (S. 522)
- C99-Standard (ISO/IEC 9899:1999)
- 7.12.6.6 Die ldexp-Funktionen (S. 225)
- 7.22 Typ-generische Mathematik <tgmath.h> (S. 335-337)
- F.9.3.6 Die ldexp-Funktionen (S. 459)
- C89/C90-Standard (ISO/IEC 9899:1990)
- 4.5.4.3 Die ldexp-Funktion
[bearbeiten] Siehe auch
| (C99)(C99) |
teilt eine Zahl in Mantisse und Potenz von 2 auf (Funktion) |
| (C99)(C99)(C99)(C99)(C99)(C99) |
berechnet effizient eine Zahl mal FLT_RADIX hoch eine Potenz (Funktion) |
| C++ Dokumentation für ldexp
| |