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

Fermé
RISC Messages postés 4 Date d'inscription samedi 6 janvier 2007 Statut Membre Dernière intervention 28 novembre 2008 - 28 nov. 2008 à 11:47
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 28 nov. 2008 à 18:35
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 254 Date d'inscription vendredi 23 février 2007 Statut Membre Dernière intervention 6 décembre 2021 29
28 nov. 2008 à 12:13
cè quoi ta var "tata"
0
RISC Messages postés 4 Date d'inscription samedi 6 janvier 2007 Statut Membre Dernière intervention 28 novembre 2008
28 nov. 2008 à 12:29
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 254 Date d'inscription vendredi 23 février 2007 Statut Membre Dernière intervention 6 décembre 2021 29
28 nov. 2008 à 12:53
teste ça :
#define round(x) ( (int)(x) <(x) ) ? (int)(x)+1: (int) (x)
0
ljm972 Messages postés 254 Date d'inscription vendredi 23 février 2007 Statut Membre Dernière intervention 6 décembre 2021 29
28 nov. 2008 à 13:04
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 samedi 6 janvier 2007 Statut Membre Dernière intervention 28 novembre 2008
28 nov. 2008 à 14:23
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
28 nov. 2008 à 14:29
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 samedi 6 janvier 2007 Statut Membre Dernière intervention 28 novembre 2008
28 nov. 2008 à 17:11
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
28 nov. 2008 à 18:35
Ok je comprends mieux ;)
Mais tu peux pas utiliser de fonctions inline ?
Cdlt
0