Namensräume
Varianten
Aktionen

logb, logbf, logbl

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
(C99)(C99)
(C99)(C23)
logb
(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       logbf( float arg );
(1) (seit C99)
double      logb( double arg );
(2) (seit C99)
long double logbl( long double arg );
(3) (seit C99)
Definiert in Header <tgmath.h>
#define logb( arg )
(4) (seit C99)
1-3) Extrahiert den Wert des vorzeichenunabhängigen, basenunabhängigen Exponenten aus dem Fließkommaargument arg und gibt ihn als Fließkommawert zurück.
4) Typ-generische Makros: Wenn arg den Typ long double hat, wird logbl aufgerufen. Andernfalls, wenn arg einen ganzzahligen Typ oder den Typ double hat, wird logb aufgerufen. Andernfalls wird logbf aufgerufen.

Formal ist der vorzeichenunabhängige Exponent der ganzzahlige Teil von logr|arg| (der von dieser Funktion als Fließkommawert zurückgegeben wird) für ein von Null verschiedenes arg, wobei r FLT_RADIX ist. Wenn arg subnormal ist, wird es so behandelt, als wäre es normalisiert.

Inhalt

[bearbeiten] Parameter

arg - Gleitkommawert

[bearbeiten] Rückgabewert

Wenn keine Fehler auftreten, wird der vorzeichenunabhängige Exponent von arg als vorzeichenbehafteter Fließkommawert zurückgegeben.

Wenn ein Domänenfehler auftritt, wird ein implementierungsdefinierter Wert zurückgegeben.

Wenn ein Polfehler auftritt, wird -HUGE_VAL, -HUGE_VALF oder -HUGE_VALL zurückgegeben.

[bearbeiten] Fehlerbehandlung

Fehler werden wie in math_errhandling angegeben gemeldet.

Domänen- oder Bereichsfehler können auftreten, wenn arg Null ist.

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

  • Wenn arg ±0 ist, wird -∞ zurückgegeben und FE_DIVBYZERO ausgelöst.
  • Wenn arg ±∞ ist, wird +∞ zurückgegeben.
  • Wenn arg NaN ist, wird NaN zurückgegeben.
  • In allen anderen Fällen ist das Ergebnis exakt (FE_INEXACT wird nie ausgelöst) und der aktuelle Rundungsmodus wird ignoriert.

[bearbeiten] Hinweise

POSIX verlangt, dass ein Polfehler auftritt, wenn arg ±0 ist.

Der von logb zurückgegebene Exponentenwert ist immer um 1 kleiner als der von frexp zurückgegebene Exponent, aufgrund der unterschiedlichen Normalisierungsanforderungen: für den von logb zurückgegebenen Exponenten e liegt |arg*r-e
|
zwischen 1 und r (typischerweise zwischen 1 und 2), aber für den von frexp zurückgegebenen Exponenten e liegt |arg*2-e
|
zwischen 0.5 und 1.

[bearbeiten] Beispiel

Vergleicht verschiedene Funktionen zur Zerlegung von Gleitkommazahlen.

#include <fenv.h>
#include <float.h>
#include <math.h>
#include <stdio.h>
// #pragma STDC FENV_ACCESS ON
 
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 = logb(f);
    printf("logb()/logb() make %f * %d^%d\n", f/scalbn(1.0, i), FLT_RADIX, i);
 
    // error handling
    feclearexcept(FE_ALL_EXCEPT);
    printf("logb(0) = %f\n", logb(0));
    if (fetestexcept(FE_DIVBYZERO))
        puts("    FE_DIVBYZERO raised");
}

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()/logb() make 1.928906 * 2^6
logb(0) = -Inf
    FE_DIVBYZERO raised

[bearbeiten] Referenzen

  • C23-Standard (ISO/IEC 9899:2024)
  • 7.12.6.11 The logb functions (S. TBD)
  • 7.25 Typ-generische Mathematik <tgmath.h> (S. TBD)
  • F.10.3.11 The logb functions (S. TBD)
  • C17-Standard (ISO/IEC 9899:2018)
  • 7.12.6.11 The logb functions (S. 179-180)
  • 7.25 Typ-generische Mathematik <tgmath.h> (S. 373-375)
  • F.10.3.11 The logb functions (S. 381)
  • C11-Standard (ISO/IEC 9899:2011)
  • 7.12.6.11 The logb functions (S. 246)
  • 7.25 Typ-generische Mathematik <tgmath.h> (S. 373-375)
  • F.10.3.11 The logb functions (S. 522)
  • C99-Standard (ISO/IEC 9899:1999)
  • 7.12.6.11 The logb functions (S. 227)
  • 7.22 Typ-generische Mathematik <tgmath.h> (S. 335-337)
  • F.9.3.11 The logb functions (S. 459)

[bearbeiten] Siehe auch

teilt eine Zahl in Mantisse und Potenz von 2 auf
(Funktion) [bearbeiten]
(C99)(C99)(C99)
extrahiert den Exponenten der gegebenen Zahl
(Funktion) [bearbeiten]
(C99)(C99)(C99)(C99)(C99)(C99)
berechnet effizient eine Zahl mal FLT_RADIX hoch eine Potenz
(Funktion) [bearbeiten]