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
Défini dans l'en-tête <math.h>
float fmodf ( float x, float y ) ;
(1) (depuis C99)
double fmod ( double x, double y ) ;
(2)
long double fmodl ( long double x, long double y ) ;
(3) (depuis C99)
Défini dans l'en-tête <tgmath.h>
#define fmod( x, y )
(4) (depuis C99)
1-3) Calcule le reste en virgule flottante de l'opération de division x / y .
4) Macro générique de type : Si un argument a le type long double , fmodl est appelé. Sinon, si un argument a un type entier ou a le type double , fmod est appelé. Sinon, fmodf est appelé.

Le reste en virgule flottante de l'opération de division x / y calculé par cette fonction est exactement la valeur x - n * y , où n est x / y avec sa partie fractionnaire tronquée.

La valeur retournée a le même signe que x et est inférieure ou égale à y en magnitude.

Table des matières

Paramètres

x, y - valeurs à virgule flottante

Valeur de retour

En cas de succès, retourne le reste en virgule flottante de la division x / y tel que défini ci-dessus.

Si une erreur de domaine se produit, une valeur définie par l'implémentation est retournée (NaN là où supporté).

Si une erreur de plage se produit en raison d'un dépassement inférieur, le résultat correct (après arrondi) est retourné.

Gestion des erreurs

Les erreurs sont signalées comme spécifié dans math_errhandling .

Une erreur de domaine peut survenir si y est nul.

Si l'implémentation prend en charge l'arithmétique virgule flottante IEEE (IEC 60559) :

  • Si x est ±0 et y n'est pas zéro, ±0 est retourné.
  • Si x est ±∞ et y n'est pas NaN, NaN est retourné et FE_INVALID est déclenché.
  • Si y est ±0 et x n'est pas NaN, NaN est retourné et FE_INVALID est déclenché.
  • Si y est ±∞ et x est fini, x est retourné.
  • Si l'un des arguments est NaN, NaN est retourné.

Notes

POSIX requiert qu'une erreur de domaine se produise si x est infini ou y est zéro.

fmod , mais pas remainder , est utile pour effectuer un enroulement silencieux des types à virgule flottante vers les types entiers non signés : ( 0.0 <= ( y = fmod ( rint ( x ) , 65536.0 ) ) ? y : 65536.0 + y ) est dans l'intervalle [ - 0.0 , 65535.0 ] , ce qui correspond à unsigned short , mais remainder ( rint ( x ) , 65536.0 ) est dans l'intervalle [ - 32767.0 , + 32768.0 ] , qui est en dehors de l'intervalle de signed short .

La version double de fmod se comporte comme si elle était implémentée comme suit :

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);
}

Exemple

#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");
}

Sortie possible :

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

Références

  • Norme C23 (ISO/CEI 9899:2024) :
  • 7.12.10.1 Les fonctions fmod (p: TBD)
  • 7.25 Mathématiques génériques de type <tgmath.h> (p: TBD)
  • F.10.7.1 Les fonctions fmod (p: TBD)
  • Norme C17 (ISO/CEI 9899:2018) :
  • 7.12.10.1 Les fonctions fmod (p: 185)
  • 7.25 Mathématiques génériques de type <tgmath.h> (p: 274-275)
  • F.10.7.1 Les fonctions fmod (p: 385)
  • Norme C11 (ISO/CEI 9899:2011) :
  • 7.12.10.1 Les fonctions fmod (p: 254)
  • 7.25 Mathématiques génériques de type <tgmath.h> (p: 373-375)
  • F.10.7.1 Les fonctions fmod (p: 528)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 7.12.10.1 Les fonctions fmod (p: 235)
  • 7.22 Mathématiques génériques de type <tgmath.h> (p: 335-337)
  • F.9.7.1 Les fonctions fmod (p: 465)
  • Norme C89/C90 (ISO/IEC 9899:1990) :
  • 4.5.6.4 La fonction fmod

Voir aussi

calcule le quotient et le reste d'une division entière
(fonction)
calcule le reste signé de l'opération de division en virgule flottante
(fonction)
(C99) (C99) (C99)
calcule le reste signé ainsi que les trois derniers bits de l'opération de division
(fonction)