Quelqu'un sait il comment renvoyer l'entier le plus proche d'un nombre à virgule à l'aide de fonctions de base en C?
Merci.
Version imprimable
Quelqu'un sait il comment renvoyer l'entier le plus proche d'un nombre à virgule à l'aide de fonctions de base en C?
Merci.
Ce n'est pas indiqué dans une FAQ cela ? Ou dans le forum :tutoriel:
ceil()
Non ceil(x) prend le plus petit entier supérieur ou égal à x
Citation:
Envoyé par FAQ
Surement pas. Appliqué à -3,2 on obtient -2 au lieu de -3.Citation:
Envoyé par Goundy
Soit on ajoute 0,5 et on prend la partie entière (au sens mathématiques) avec la fonction floor, soit on se tourne vers des fonctions comme nearbyint et rint (non conforme Iso C9X).
--
SaintAmand
Hum, choisi ton camp camarade. C'est soit C9x soit ISO-C99.Citation:
Envoyé par SaintAmand
http://emmanuel-delahaye.developpez.com/notes.htm#norme
:faq:Citation:
Envoyé par petdelascar
http://c.developpez.com/faq/c/?page=..._round_correct
Cette fonction semble se comporter correctement.
Petit exemple de test unitaire :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 #include <math.h> double Arrondit(const double x) { if (0<=x) { return floor(x+0.5); } else { return ceil(x-0.5); } } #include <float.h> #define N(a) (sizeof(a)/sizeof*(a)) int main (void) { struct test { unsigned long test; double in; long out; } a[]= { {10, 0.0 ,0}, {11, 1.0 ,1}, {12, 1.5 - DBL_EPSILON ,1}, {13, 1.5 ,2}, {20, -0.0 ,0}, {21, -1.0 ,-1}, {22, -1.5 + DBL_EPSILON ,-1}, {23, -1.5 ,-2}, }; size_t i; int err = 0; for (i = 0; i < N(a) && !err; i++) { struct test const *p = a + i; double n = Arrondit (p->in); if (n != p->out) { printf ("err at test %lu\n", p->test); err = 1; } } if (!err) { puts ("\nP A S S E D\n"); } return 0; }
J'ajoute une petite macro toute simple qui fait le travail très bien:
Code:
1
2#define nint( x ) (x>0.0?(int)(x+0.5):(int)(x-0.5))