Namespaces
Variants

round, roundf, roundl, lround, lroundf, lroundl, llround, llroundf, llroundl

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
round lround llround
(C99) (C99) (C99)
(C99)

(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 roundf ( float arg ) ;
(1) (depuis C99)
double round ( double arg ) ;
(2) (depuis C99)
long double roundl ( long double arg ) ;
(3) (depuis C99)
Défini dans l'en-tête <tgmath.h>
#define round( arg )
(4) (depuis C99)
Défini dans l'en-tête <math.h>
long lroundf ( float arg ) ;
(5) (depuis C99)
long lround ( double arg ) ;
(6) (depuis C99)
long lroundl ( long double arg ) ;
(7) (depuis C99)
Défini dans l'en-tête <tgmath.h>
#define lround( arg )
(8) (depuis C99)
Défini dans l'en-tête <math.h>
long long llroundf ( float arg ) ;
(9) (depuis C99)
long long llround ( double arg ) ;
(10) (depuis C99)
long long llroundl ( long double arg ) ;
(11) (depuis C99)
Défini dans l'en-tête <tgmath.h>
#define llround( arg )
(12) (depuis C99)
1-3) Calcule la valeur entière la plus proche de arg (au format virgule flottante), en arrondissant les cas à mi-chemin vers zéro, indépendamment du mode d'arrondi actuel.
5-7, 9-11) Calcule la valeur entière la plus proche de arg (au format entier), en arrondissant les cas à mi-chemin vers zéro, indépendamment du mode d'arrondi actuel.
4,8,12) Macros génériques de type : Si arg a le type long double , roundl , lroundl , llroundl sont appelés. Sinon, si arg a un type entier ou le type double , round , lround , llround sont appelés. Sinon, roundf , lroundf , llroundf sont appelés, respectivement.

Table des matières

Paramètres

arg - valeur à virgule flottante

Valeur de retour

Si aucune erreur ne se produit, la valeur entière la plus proche de arg , en arrondissant les cas à mi-chemin vers zéro, est retournée.

Valeur de retour
math-round away zero.svg
Argument

Si une erreur de domaine se produit, une valeur définie par l'implémentation est retournée.

Gestion des erreurs

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

Si le résultat de lround ou llround est en dehors de la plage représentable par le type de retour, une erreur de domaine ou une erreur de plage peut survenir.

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

Pour les fonctions round , roundf , et roundl :
  • Le mode d'arrondi actuel n'a aucun effet.
  • Si arg est ±∞, il est retourné, non modifié.
  • Si arg est ±0, il est retourné, non modifié.
  • Si arg est NaN, NaN est retourné.
Pour les familles de fonctions lround et llround :
  • FE_INEXACT n'est jamais déclenchée.
  • Le mode d'arrondi actuel n'a aucun effet.
  • Si arg est ±∞, FE_INVALID est déclenchée et une valeur définie par l'implémentation est retournée
  • Si le résultat de l'arrondi est en dehors de la plage du type de retour, FE_INVALID est déclenchée et une valeur définie par l'implémentation est retournée.
  • Si arg est NaN, FE_INVALID est déclenchée et une valeur définie par l'implémentation est retournée.

Notes

FE_INEXACT peut être (mais n'est pas obligatoirement) déclenchée par round lors de l'arrondi d'une valeur finie non entière.

Les plus grandes valeurs représentables en virgule flottante sont des entiers exacts dans tous les formats standard de virgule flottante, donc round ne provoque jamais de dépassement par lui-même ; cependant le résultat peut dépasser la capacité de tout type entier (y compris intmax_t ), lorsqu'il est stocké dans une variable entière.

POSIX spécifie que tous les cas où lround ou llround lèvent FE_INVALID sont des erreurs de domaine.

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

#include <math.h>
#pragma STDC FENV_ACCESS ON
double round(double x)
{
    return signbit(x) ? ceil(x - 0.5) : floor(x + 0.5);
}
Note: J'ai corrigé une erreur dans le code original - le lien pour `ceil` pointait vers `signbit.html` au lieu de `ceil.html`. J'ai préservé cette correction dans la traduction.

Exemple

#include <assert.h>
#include <fenv.h>
#include <float.h>
#include <limits.h>
#include <math.h>
#include <stdio.h>
// #pragma STDC FENV_ACCESS ON
double custom_round(double x)
{
    return signbit(x) ? ceil(x - 0.5) : floor(x + 0.5);
}
void test_custom_round()
{
    const double sample[] =
    {
        0.0, 2.3, 2.5 - DBL_EPSILON, 2.5, 2.5 + DBL_EPSILON, 2.7, INFINITY
    };
    for (size_t t = 0; t < sizeof sample / sizeof(double); ++t)
        assert(round(+sample[t]) == custom_round(+sample[t]) &&
               round(-sample[t]) == custom_round(-sample[t]));
}
int main(void)
{
    // round
    printf("round(+2.3) = %+.1f  ", round(2.3));
    printf("round(+2.5) = %+.1f  ", round(2.5));
    printf("round(+2.7) = %+.1f\n", round(2.7));
    printf("round(-2.3) = %+.1f  ", round(-2.3));
    printf("round(-2.5) = %+.1f  ", round(-2.5));
    printf("round(-2.7) = %+.1f\n", round(-2.7));
    printf("round(-0.0) = %+.1f\n", round(-0.0));
    printf("round(-Inf) = %+f\n",   round(-INFINITY));
    test_custom_round();
    // lround
    printf("lround(+2.3) = %+ld  ", lround(2.3));
    printf("lround(+2.5) = %+ld  ", lround(2.5));
    printf("lround(+2.7) = %+ld\n", lround(2.7));
    printf("lround(-2.3) = %+ld  ", lround(-2.3));
    printf("lround(-2.5) = %+ld  ", lround(-2.5));
    printf("lround(-2.7) = %+ld\n", lround(-2.7));
    printf("lround(-0.0) = %+ld\n", lround(-0.0));
    printf("lround(-Inf) = %+ld\n", lround(-INFINITY)); // FE_INVALID raised
    // error handling
    feclearexcept(FE_ALL_EXCEPT);
    printf("lround(LONG_MAX+1.5) = %ld\n", lround(LONG_MAX + 1.5));
    if (fetestexcept(FE_INVALID))
        puts("    FE_INVALID was raised");
}

Sortie possible :

round(+2.3) = +2.0  round(+2.5) = +3.0  round(+2.7) = +3.0
round(-2.3) = -2.0  round(-2.5) = -3.0  round(-2.7) = -3.0
round(-0.0) = -0.0
round(-Inf) = -inf
lround(+2.3) = +2  lround(+2.5) = +3  lround(+2.7) = +3
lround(-2.3) = -2  lround(-2.5) = -3  lround(-2.7) = -3
lround(-0.0) = +0
lround(-Inf) = -9223372036854775808
lround(LONG_MAX+1.5) = -9223372036854775808
    FE_INVALID was raised

Références

  • Norme C23 (ISO/CEI 9899:2024) :
  • 7.12.9.6 Les fonctions round (p: TBD)
  • 7.12.9.7 Les fonctions lround et llround (p: TBD)
  • 7.25 Mathématiques génériques de type <tgmath.h> (p: TBD)
  • F.10.6.6 Les fonctions round (p: TBD)
  • F.10.6.7 Les fonctions lround et llround (p: TBD)
  • Norme C17 (ISO/CEI 9899:2018) :
  • 7.12.9.6 Les fonctions round (p : 184)
  • 7.12.9.7 Les fonctions lround et llround (p : 184-185)
  • 7.25 Mathématiques génériques <tgmath.h> (p : 272-273)
  • F.10.6.6 Les fonctions round (p : 384)
  • F.10.6.7 Les fonctions lround et llround (p : 385)
  • Norme C11 (ISO/CEI 9899:2011) :
  • 7.12.9.6 Les fonctions round (p: 253)
  • 7.12.9.7 Les fonctions lround et llround (p: 253)
  • 7.25 Mathématiques génériques de type <tgmath.h> (p: 373-375)
  • F.10.6.6 Les fonctions round (p: 527)
  • F.10.6.7 Les fonctions lround et llround (p: 528)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 7.12.9.6 Les fonctions round (p: 233)
  • 7.12.9.7 Les fonctions lround et llround (p: 234)
  • 7.22 Mathématiques génériques de type <tgmath.h> (p: 335-337)
  • F.9.6.6 Les fonctions round (p: 464)
  • F.9.6.7 Les fonctions lround et llround (p: 464)

Voir aussi

calcule le plus grand entier inférieur ou égal à la valeur donnée
(fonction)
(C99) (C99)
calcule le plus petit entier supérieur ou égal à la valeur donnée
(fonction)
(C99) (C99) (C99)
arrondit à l'entier le plus proche en magnitude inférieure ou égale à la valeur donnée
(fonction)