Namespaces
Variants

modf, modff, modfl

From cppreference.net
< c ‎ | numeric ‎ | math
Common mathematical functions
Functions
Basic operations
(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 modff ( float arg, float * iptr ) ;
(1) (depuis C99)
double modf ( double arg, double * iptr ) ;
(2)
long double modfl ( long double arg, long double * iptr ) ;
(3) (depuis C99)
1-3) Décompose la valeur en virgule flottante donnée arg en parties intégrale et fractionnaire, chacune ayant le même type et le même signe que arg . La partie intégrale (au format virgule flottante) est stockée dans l'objet pointé par iptr .

Table des matières

Paramètres

arg - valeur en virgule flottante
iptr - pointeur vers une valeur en virgule flottante pour stocker la partie entière

Valeur de retour

Si aucune erreur ne se produit, retourne la partie fractionnaire de arg avec le même signe que arg . La partie entière est placée dans la valeur pointée par iptr .

La somme de la valeur retournée et de la valeur stockée dans * iptr donne arg (en tenant compte de l'arrondi).

Gestion des erreurs

Cette fonction n'est sujette à aucune erreur spécifiée dans math_errhandling .

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

  • Si arg est ±0, ±0 est renvoyé, et ±0 est stocké dans * iptr .
  • Si arg est ±∞, ±0 est renvoyé, et ±∞ est stocké dans * iptr .
  • Si arg est NaN, NaN est renvoyé, et NaN est stocké dans * iptr .
  • La valeur renvoyée est exacte, le mode d'arrondi actuel est ignoré.

Notes

Cette fonction se comporte comme si elle était implémentée comme suit :

double modf(double value, double *iptr)
{
#pragma STDC FENV_ACCESS ON
    int save_round = fegetround();
    fesetround(FE_TOWARDZERO);
    *iptr = std::nearbyint(value);
    fesetround(save_round);
    return copysign(isinf(value) ? 0.0 : value - (*iptr), value);
}

Exemple

#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 %.2f + %.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);
    // special values
    f2 = modf(-0.0, &f3);
    printf("modf(-0) makes %.2f + %.2f\n", f3, f2);
    f2 = modf(-INFINITY, &f3);
    printf("modf(-Inf) makes %.2f + %.2f\n", f3, f2);
}

Sortie possible :

Given the number 123.45 or 0x1.edccccccccccdp+6 in hex,
modf() makes 123.00 + 0.45
frexp() makes 0.964453 * 2^7
logb()/ilogb() make 1.92891 * 2^6
modf(-0) makes -0.00 + -0.00
modf(-Inf) makes -INF + -0.00

Références

  • Norme C23 (ISO/CEI 9899:2024) :
  • 7.12.6.12 Les fonctions modf (p: TBD)
  • F.10.3.12 Les fonctions modf (p: TBD)
  • Norme C17 (ISO/CEI 9899:2018):
  • 7.12.6.12 Les fonctions modf (p: TBD)
  • F.10.3.12 Les fonctions modf (p: TBD)
  • Norme C11 (ISO/CEI 9899:2011) :
  • 7.12.6.12 Les fonctions modf (p: 246-247)
  • F.10.3.12 Les fonctions modf (p: 523)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 7.12.6.12 Les fonctions modf (p: 227)
  • F.9.3.12 Les fonctions modf (p: 460)
  • Norme C89/C90 (ISO/IEC 9899:1990) :
  • 4.5.4.6 La fonction modf

Voir aussi

(C99) (C99) (C99)
arrondit à l'entier le plus proche dont la magnitude n'est pas supérieure à la valeur donnée
(fonction)