[C] Comment arrondir dans une expr. evaluée

RISC Messages postés 4 Date d'inscription   Statut Membre Dernière intervention   -  
fiddy Messages postés 11069 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

7 réponses

ljm972 Messages postés 255 Date d'inscription   Statut Membre Dernière intervention   29
 
cè quoi ta var "tata"
0
RISC Messages postés 4 Date d'inscription   Statut Membre Dernière intervention  
 
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....
0
ljm972 Messages postés 255 Date d'inscription   Statut Membre Dernière intervention   29
 
teste ça :
#define round(x) ( (int)(x) <(x) ) ? (int)(x)+1: (int) (x)
0
ljm972 Messages postés 255 Date d'inscription   Statut Membre Dernière intervention   29
 
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
RISC Messages postés 4 Date d'inscription   Statut Membre Dernière intervention  
 
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
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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
0
RISC Messages postés 4 Date d'inscription   Statut Membre Dernière intervention  
 
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 ;=)
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Ok je comprends mieux ;)
Mais tu peux pas utiliser de fonctions inline ?
Cdlt
0