[C] Comment arrondir dans une expr. evaluée
RISC
Messages postés
4
Statut
Membre
-
fiddy Messages postés 441 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 441 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je cherche à arrondir toto dont le résultat est non entier :
#define toto (A/B/C)-1 // je souhaiterais avoir l'équivalent de round((A/B/C)-1)
Dans mon cas toto est est int
J'ai lu dans un forum qu'on peut arriver à faire cela de cette manière :
tata = toto + 0.5;
Comment puis-je caster toto pour que le calcul se fasse correctement ?
merci
Je cherche à arrondir toto dont le résultat est non entier :
#define toto (A/B/C)-1 // je souhaiterais avoir l'équivalent de round((A/B/C)-1)
Dans mon cas toto est est int
J'ai lu dans un forum qu'on peut arriver à faire cela de cette manière :
tata = toto + 0.5;
Comment puis-je caster toto pour que le calcul se fasse correctement ?
merci
Configuration: Windows XP Firefox 3.0.4
7 réponses
-
cè quoi ta var "tata"
-
Salut,
tata est un int
J'ai trouvé une macro sympa sur internet :
#define round(x) (int)((x)>0?(x)+0.5:(x)-0.5)
J'ai essayé cela :
#define toto (2/3) // plus tard toto sera une expression plus compliquée
tata = round(toto);
mais je n'arrive pas obtenir un résultat correct....
-
teste ça :
#define round(x) ( (int)(x) <(x) ) ? (int)(x)+1: (int) (x) -
ce que tu veux :
si x-(int) x < 0.5 alors retourner (int)x
sinon retourner (int) x +1
#define round(x) ( x-(int)(x) <0.5 ) ? (int)(x): (int) (x) +1 -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Salut,
J'ai finalement trouvé la source de mon problème. Je fournissais à la macro non pas une variable mais une expression.
Cette expression donnait déjà une valeur tronquée à cause des calculs internes d'évaluation.
J'ai résolu mon probème en castant en float la valeur passée à la macro et en forçant la macro à travailler sur des float :
#define TOTO 121
#define round(x) (int)(((float)(x))>0?(float)(x)+0.5:(float)(x)-0.5)
#define TATA round((TOTO/(float)15)-1)
....
A = TATA;
NB : si je ne caste pas (x) dans la macro round(x) j'ai une erreur dans mon compilateur basé sur GCC
Merci -
Salut,
Pourquoi tu t'embêtes à faire une macro round, alors que la fonction fait déjà partie intégrante de la bibliothèque math.h ?
Sinon, il est conseillé d'éviter d'utiliser les macro, et d'y préférer les fonctions inline. Cela évite justement les prises de têtes comme tu vis ^^.
Cdlt -
Salut,
Merci pour la suggestion, mais je ne peux pas utiliser une librairie car je programme sur un microcontroleur ou les mémoires programme et données sont très petits (programmation embarquée)...
Ma solution est je pense la plus compacte, même si le style C n'est pas des plus catholique ;=)