round, roundf, roundl, lround, lroundf, lroundl, llround, llroundf, llroundl
|
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) |
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.
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, etroundl:- 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
lroundetllround:- 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 :
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
|
(C99)
(C99)
|
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) |
|
documentation C++
pour
round
|
|