Namensräume
Varianten
Aktionen

fmod, fmodf, fmodl

Von cppreference.com
< c‎ | numerik‎ | math
 
 
 
Allgemeine mathematische Funktionen
Funktionen
Grundlegende Operationen
fmod
(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)
(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       fmodf( float x, float y );
(1) (seit C99)
double      fmod( double x, double y );
(2)
long double fmodl( long double x, long double y );
(3) (seit C99)
Definiert in Header <tgmath.h>
#define fmod( x, y )
(4) (seit C99)
1-3) Berechnet den Gleitkomma-Rest der Divisionoperation x / y.
4) Typ-generisches Makro: Wenn ein Argument vom Typ long double ist, wird fmodl aufgerufen. Andernfalls, wenn ein Argument vom ganzzahligen Typ oder vom Typ double ist, wird fmod aufgerufen. Andernfalls wird fmodf aufgerufen.

Der von dieser Funktion berechnete Gleitkomma-Rest der Divisionoperation x / y ist genau der Wert x - n * y, wobei n x / y mit abgeschnittener gebrochener Stelle ist.

Der zurückgegebene Wert hat dasselbe Vorzeichen wie x und ist betragsmäßig kleiner oder gleich y.

Inhalt

[bearbeiten] Parameter

x, y - Gleitkommazahlen

[bearbeiten] Rückgabewert

Bei Erfolg wird der Gleitkomma-Rest der Division x / y wie oben definiert zurückgegeben.

Wenn ein Domänenfehler auftritt, wird ein implementierungsabhängiger Wert zurückgegeben (NaN, wo unterstützt).

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

[bearbeiten] Fehlerbehandlung

Fehler werden wie in math_errhandling angegeben gemeldet.

Ein Domänenfehler kann auftreten, wenn y Null ist.

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

  • Wenn x ±0 ist und y nicht Null ist, wird ±0 zurückgegeben.
  • Wenn x ±∞ ist und y nicht NaN ist, wird NaN zurückgegeben und FE_INVALID ausgelöst.
  • Wenn y ±0 ist und x nicht NaN ist, wird NaN zurückgegeben und FE_INVALID ausgelöst.
  • Wenn y ±∞ ist und x endlich ist, wird x zurückgegeben.
  • Wenn eines der Argumente NaN ist, wird NaN zurückgegeben.

[bearbeiten] Hinweise

POSIX schreibt vor, dass ein Domänenfehler auftritt, wenn x unendlich ist oder y Null ist.

fmod, aber nicht remainder, ist nützlich für das lautlose Überlauf-/Unterlauf-Wrapping von Gleitkommatypen in vorzeichenlose Ganzzahltypen: (0.0 <= (y = fmod(rint(x), 65536.0 )) ? y : 65536.0 + y) liegt im Bereich [-0.065535.0], was unsigned short entspricht, aber remainder(rint(x), 65536.0) liegt im Bereich [-32767.0+32768.0], was außerhalb des Bereichs von signed short liegt.

Die double-Version von fmod verhält sich so, als wäre sie wie folgt implementiert

double fmod(double x, double y)
{
#pragma STDC FENV_ACCESS ON
    double result = remainder(fabs(x), (y = fabs(y)));
    if (signbit(result))
        result += y;
    return copysign(result, x);
}

[bearbeiten] Beispiel

#include <fenv.h>
#include <math.h>
#include <stdio.h>
 
// #pragma STDC FENV_ACCESS ON
 
int main(void)
{
    printf("fmod(+5.1, +3.0) = %.1f\n", fmod(5.1, 3));
    printf("fmod(-5.1, +3.0) = %.1f\n", fmod(-5.1, 3));
    printf("fmod(+5.1, -3.0) = %.1f\n", fmod(5.1, -3));
    printf("fmod(-5.1, -3.0) = %.1f\n", fmod(-5.1, -3));
 
    // special values
    printf("fmod(+0.0, 1.0) = %.1f\n", fmod(0, 1));
    printf("fmod(-0.0, 1.0) = %.1f\n", fmod(-0.0, 1));
    printf("fmod(+5.1, Inf) = %.1f\n", fmod(5.1, INFINITY));
 
    // error handling
    feclearexcept(FE_ALL_EXCEPT);
    printf("fmod(+5.1, 0) = %.1f\n", fmod(5.1, 0));
    if (fetestexcept(FE_INVALID))
        puts("    FE_INVALID raised");
}

Mögliche Ausgabe

fmod(+5.1, +3.0) = 2.1
fmod(-5.1, +3.0) = -2.1
fmod(+5.1, -3.0) = 2.1
fmod(-5.1, -3.0) = -2.1
fmod(+0.0, 1.0) = 0.0
fmod(-0.0, 1.0) = -0.0
fmod(+5.1, Inf) = 5.1
fmod(+5.1, 0) = nan
    FE_INVALID raised

[bearbeiten] Referenzen

  • C23-Standard (ISO/IEC 9899:2024)
  • 7.12.10.1 The fmod functions (S. TBD)
  • 7.25 Typ-generische Mathematik <tgmath.h> (S. TBD)
  • F.10.7.1 The fmod functions (S. TBD)
  • C17-Standard (ISO/IEC 9899:2018)
  • 7.12.10.1 The fmod functions (S. 185)
  • 7.25 Typ-generische Mathematik <tgmath.h> (S. 274-275)
  • F.10.7.1 The fmod functions (S. 385)
  • C11-Standard (ISO/IEC 9899:2011)
  • 7.12.10.1 The fmod functions (S. 254)
  • 7.25 Typ-generische Mathematik <tgmath.h> (S. 373-375)
  • F.10.7.1 The fmod functions (S. 528)
  • C99-Standard (ISO/IEC 9899:1999)
  • 7.12.10.1 The fmod functions (S. 235)
  • 7.22 Typ-generische Mathematik <tgmath.h> (S. 335-337)
  • F.9.7.1 The fmod functions (S. 465)
  • C89/C90-Standard (ISO/IEC 9899:1990)
  • 4.5.6.4 The fmod function

[bearbeiten] Siehe auch

berechnet Quotient und Rest der ganzzahligen Division
(Funktion) [bearbeiten]
berechnet den vorzeichenbehafteten Rest der Gleitkommadivision
(Funktion) [bearbeiten]
(C99)(C99)(C99)
berechnet den vorzeichenbehafteten Rest sowie die drei letzten Bits der Division
(Funktion) [bearbeiten]