frexp, frexpf, frexpl
| Definiert in Header <math.h> |
||
| float frexpf( float arg, int* exp ); |
(1) | (seit C99) |
| double frexp( double arg, int* exp ); |
(2) | |
| long double frexpl( long double arg, int* exp ); |
(3) | (seit C99) |
| Definiert in Header <tgmath.h> |
||
| #define frexp( arg, exp ) |
(4) | (seit C99) |
x in einen normalisierten Bruch und eine ganzzahlige Zweierpotenz.frexpl aufgerufen. Andernfalls, wenn arg einen ganzzahligen Typ oder den Typ double hat, wird frexp aufgerufen. Andernfalls wird frexpf aufgerufen.Inhalt |
[edit] Parameter
| arg | - | Gleitkommawert |
| exp | - | Zeiger auf einen ganzzahligen Wert, in dem der Exponent gespeichert wird |
[edit] Rückgabewert
Wenn arg null ist, wird null zurückgegeben und null in *exp gespeichert.
Andernfalls (wenn arg nicht null ist), wenn keine Fehler auftreten, wird der Wert x im Bereich (-1;-0.5], [0.5; 1) zurückgegeben und ein ganzzahliger Wert in *exp gespeichert, so dass x×2(*exp)
=arg.
Wenn der in *exp zu speichernde Wert außerhalb des Bereichs von int liegt, ist das Verhalten undefiniert.
Wenn arg keine Fließkommazahl ist, ist das Verhalten undefiniert.
[edit] Fehlerbehandlung
Diese Funktion unterliegt keinen Fehlern, die in math_errhandling spezifiziert sind.
Wenn die Implementierung IEEE-Gleitkomma-Arithmetik (IEC 60559) unterstützt,
- Wenn
arg±0 ist, wird es unverändert zurückgegeben und0in *exp gespeichert. - Wenn
arg±∞ ist, wird es zurückgegeben und ein undefinierter Wert in *exp gespeichert. - Wenn
argNaN ist, wird NaN zurückgegeben und ein undefinierter Wert in *exp gespeichert. - Es werden keine Gleitkommaausnahmen ausgelöst.
- Wenn FLT_RADIX 2 ist (oder eine Zweierpotenz), ist der zurückgegebene Wert exakt, der aktuelle Rundungsmodus wird ignoriert.
[edit] Anmerkungen
Auf einem Binärsystem (wo FLT_RADIX 2 ist), kann frexp wie folgt implementiert sein:
Die Funktion frexp kann zusammen mit ihrer Dualfunktion, ldexp, verwendet werden, um die Darstellung einer Gleitkommazahl zu manipulieren, ohne direkte Bitmanipulationen durchzuführen.
[edit] Beispiel
#include <float.h> #include <math.h> #include <stdio.h> int main(void) { double f = 123.45; printf("Given the number %.2f or %a in hex,\n", f, f); double f3; double f2 = modf(f, &f3); printf("modf() makes %.0f + %.2f\n", f3, f2); int i; f2 = frexp(f, &i); printf("frexp() makes %f * 2^%d\n", f2, i); i = ilogb(f); printf("logb()/ilogb() make %f * %d^%d\n", f/scalbn(1.0, i), FLT_RADIX, i); }
Mögliche Ausgabe
Given the number 123.45 or 0x1.edccccccccccdp+6 in hex, modf() makes 123 + 0.45 frexp() makes 0.964453 * 2^7 logb()/ilogb() make 1.92891 * 2^6
[edit] Referenzen
- C23-Standard (ISO/IEC 9899:2024)
- 7.12.6.4 The frexp functions (p: TBD)
- 7.25 Typ-generische Mathematik <tgmath.h> (S. TBD)
- F.10.3.4 The frexp functions (p: TBD)
- C17-Standard (ISO/IEC 9899:2018)
- 7.12.6.4 The frexp functions (p: TBD)
- 7.25 Typ-generische Mathematik <tgmath.h> (S. TBD)
- F.10.3.4 The frexp functions (p: TBD)
- C11-Standard (ISO/IEC 9899:2011)
- 7.12.6.4 The frexp functions (p: 243)
- 7.25 Typ-generische Mathematik <tgmath.h> (S. 373-375)
- F.10.3.4 The frexp functions (p: 521)
- C99-Standard (ISO/IEC 9899:1999)
- 7.12.6.4 The frexp functions (p: 224)
- 7.22 Typ-generische Mathematik <tgmath.h> (S. 335-337)
- F.9.3.4 The frexp functions (p: 458)
- C89/C90-Standard (ISO/IEC 9899:1990)
- 4.5.4.2 The frexp function
[edit] Siehe auch
| (C99)(C99) |
multipliziert eine Zahl mit 2 hoch eine Potenz (Funktion) |
| (C99)(C99)(C99) |
extrahiert den Exponenten der gegebenen Zahl (Funktion) |
| (C99)(C99)(C99) |
extrahiert den Exponenten der gegebenen Zahl (Funktion) |
| (C99)(C99) |
teilt eine Zahl in ganzzahligen und gebrochenen Teil auf (Funktion) |
| C++ Dokumentation für frexp
| |