Namespaces
Variants

fmod, fmodf, fmodl

From cppreference.net
< c ‎ | numeric ‎ | math
Common mathematical functions
Functions
Basic operations
fmod
(C99)
(C99)
(C99)
(C99) (C99) (C99) (C23)
Maximum/minimum operations
Exponential functions
Power functions
Trigonometric and hyperbolic functions
Nearest integer floating-point
(C99) (C99) (C99)
(C23) (C23) (C23) (C23)
Floating-point manipulation
Narrowing operations
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
Quantum and quantum exponent
Decimal re-encoding functions
Total order and payload functions
Classification
Error and gamma functions
(C99)
(C99)
(C99)
(C99)
Types
Macro constants
Special floating-point values
Arguments and return values
Error handling
Fast operation indicators
Definiert im 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 im Header <tgmath.h>
#define fmod( x, y )
(4) (seit C99)
1-3) Berechnet den Gleitkomma-Rest der Divisionsoperation x / y .
4) Typgenerisches Makro: Wenn ein Argument den Typ long double hat, wird fmodl aufgerufen. Andernfalls, wenn ein Argument ganzzahligen Typ oder den Typ double hat, wird fmod aufgerufen. Andernfalls wird fmodf aufgerufen.

Der Gleitkomma-Rest der Divisionsoperation x / y , der von dieser Funktion berechnet wird, ist exakt der Wert x - n * y , wobei n gleich x / y mit abgeschnittenem Nachkommaanteil ist.

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

Inhaltsverzeichnis

Parameter

x, y - Gleitkommawerte

Rückgabewert

Bei Erfolg gibt es den Gleitkomma-Rest der Division x / y wie oben definiert zurück.

Wenn ein Domänenfehler auftritt, wird ein implementierungsdefinierter Wert zurückgegeben (NaN, sofern unterstützt).

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

Fehlerbehandlung

Fehler werden gemeldet, wie in math_errhandling festgelegt.

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

Wenn die Implementierung IEEE-Gleitkommaarithmetik (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.

Hinweise

POSIX erfordert dass ein Domänenfehler auftritt, wenn x unendlich ist oder y null ist.

fmod , aber nicht remainder ist nützlich für das stille Umwandeln von Gleitkommatypen in vorzeichenlose Ganzzahltypen: ( 0.0 <= ( y = fmod ( rint ( x ) , 65536.0 ) ) ? y : 65536.0 + y ) liegt im Bereich [ - 0.0 , 65535.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, 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);
}

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));
    // Spezialwerte
    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));
    // Fehlerbehandlung
    feclearexcept(FE_ALL_EXCEPT);
    printf("fmod(+5.1, 0) = %.1f\n", fmod(5.1, 0));
    if (fetestexcept(FE_INVALID))
        puts("    FE_INVALID ausgelöst");
}

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 ausgelöst

Referenzen

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

Siehe auch

berechnet Quotient und Rest der ganzzahligen Division
(Funktion)
berechnet den vorzeichenbehafteten Rest der Gleitkomma-Divisionsoperation
(Funktion)
(C99) (C99) (C99)
berechnet den vorzeichenbehafteten Rest sowie die drei letzten Bits der Divisionsoperation
(Funktion)