[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
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
A voir également:
- [C] Comment arrondir dans une expr. evaluée
- Les données fournies dans le fichier à télécharger peuvent être synthétisées par le tableau récapitulatif suivant. dans le fichier, générez ce tableau automatiquement (tableau croisé dynamique ou table de pilote) à partir des 4 premières colonnes. cinq valeurs manquent dans le tableau suivant. retrouvez-les dans votre tableau puis reportez-les, arrondies à l’entier le plus proche, dans la zone de réponse. - Forum Excel
- Arrondir bout tracé illustrator - Forum Illustrator
- Excel arrondir au 0.5 supérieur - Forum Excel
- Publipostage arrondir les chiffres - Forum Word
- Javascript arrondir - Forum Webmastering
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
28 nov. 2008 à 12:13
cè quoi ta var "tata"
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
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....
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....
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
28 nov. 2008 à 12:53
teste ça :
#define round(x) ( (int)(x) <(x) ) ? (int)(x)+1: (int) (x)
#define round(x) ( (int)(x) <(x) ) ? (int)(x)+1: (int) (x)
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
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
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
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
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
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
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
28 nov. 2008 à 14:29
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
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
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
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 ;=)
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 ;=)
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
28 nov. 2008 à 18:35
28 nov. 2008 à 18:35
Ok je comprends mieux ;)
Mais tu peux pas utiliser de fonctions inline ?
Cdlt
Mais tu peux pas utiliser de fonctions inline ?
Cdlt