Conversion de types en C

Conversion de types en C - C - Programmation

Marsh Posté le 22-05-2006 à 16:45:10    

Soit x et y 2 entiers, pour vous est ce que :
- (int) (x/(255*y)+0.5)
et  
- (int) (x/((float)255*y)+0.5)
sont equivalents ? Perso je pense que la 1ere peut me donner un arrondi bidon, mais je ne suis pas sur :o


---------------
Les hommes n'acceptent le changement que dans la nécessité et ils ne voient la nécessité que dans la crise.
Reply

Marsh Posté le 22-05-2006 à 16:45:10   

Reply

Marsh Posté le 22-05-2006 à 16:50:35    

(float)255 ca veut pas dire grand chose, de toutes façons ...

Reply

Marsh Posté le 22-05-2006 à 17:01:46    

Je peux bien faire un cast de 255 non ? Ca revient a ecrire 255.0 ?
Je me trompe p-e totalement, mais si je n'ai que des entiers, alors mon resultats sera arrondi avant que j'ai pu lui ajouter 0.5 ?


---------------
Les hommes n'acceptent le changement que dans la nécessité et ils ne voient la nécessité que dans la crise.
Reply

Marsh Posté le 22-05-2006 à 17:04:37    

c'est quoi ton but ?
 

Reply

Marsh Posté le 22-05-2006 à 17:08:54    

Le but, c'est d'arrondir un resultat decimal a l'entier le plus proche.
En C la technique commune est d'ajouter 0.5, car l'arrondissement se fait tjrs a l'inferieur.


---------------
Les hommes n'acceptent le changement que dans la nécessité et ils ne voient la nécessité que dans la crise.
Reply

Marsh Posté le 22-05-2006 à 17:14:53    

sauf si tu lis la doc et que tu utilises floor() ou ceil(), auquel cas tu choisis ton arrondi [:moule_bite]

Reply

Marsh Posté le 22-05-2006 à 17:19:24    

Tounet a écrit :

Je peux bien faire un cast de 255 non ? Ca revient a ecrire 255.0 ?


Non.


255            -> int
(float) 255    -> float
(double) 255   -> double
255.0f         -> float
255.0          -> double


Message édité par Emmanuel Delahaye le 22-05-2006 à 17:20:31

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 22-05-2006 à 17:31:09    

Merci pour vos reponses, ca m'apporte des precisions.
 
Mais ca ne repond pas a ma 1ere question.
Je reformule plus clairement
si j'ai x, y et z, 3 entiers.
 
Est ce que x/(y*z)+0.5 sera equivalent a x/((float)y*z)+0.5 ?
En clair est ce que le resultat de ma division sera un entier si tous ses operandes en sont ?

Message cité 2 fois
Message édité par Tounet le 22-05-2006 à 17:49:29

---------------
Les hommes n'acceptent le changement que dans la nécessité et ils ne voient la nécessité que dans la crise.
Reply

Marsh Posté le 22-05-2006 à 18:18:31    

de mémoire à l'arrache, je préfère écrire cela comme ça:
 
int result=(float).....
ou
int result=((float)....);
 
généralement j'évites de mixer entier & flottant par souci de vitesse :D

Reply

Marsh Posté le 22-05-2006 à 18:18:39    

Tounet a écrit :

Merci pour vos reponses, ca m'apporte des precisions.
 
Mais ca ne repond pas a ma 1ere question.
Je reformule plus clairement
si j'ai x, y et z, 3 entiers.
 
Est ce que x/(y*z)+0.5 sera equivalent a x/((float)y*z)+0.5 ?
En clair est ce que le resultat de ma division sera un entier si tous ses operandes en sont ?


 
toujours promotion vers le type le plus "large"
 
x/(y*z) -> int
x/(y*z)+0.5 -> double
(float)y*z -> float
x/((float)y*z) -> float
...

Reply

Marsh Posté le 22-05-2006 à 18:18:39   

Reply

Marsh Posté le 22-05-2006 à 18:50:54    

Tounet a écrit :

Est ce que x/(y*z)+0.5 sera equivalent a x/((float)y*z)+0.5 ?


fais toi ta propre idée en codant ça.
 

Tounet a écrit :

En clair est ce que le resultat de ma division sera un entier si tous ses operandes en sont ?


Test donc ça en assignant le résultat dans un double, un float, un int, en castant ou non.

Reply

Marsh Posté le 22-05-2006 à 19:19:02    

skelter a écrit :

toujours promotion vers le type le plus "large"
 
x/(y*z) -> int
x/(y*z)+0.5 -> double
(float)y*z -> float
x/((float)y*z) -> float
...


 
Si je ne m'abuse, la version où on cast y en float est plus précise, car dans l'autre cas, on a 2 casts implicites en int (et donc 2 arrondis) au total, le premier étant x/(y*z) et le second étant l'affectation finale.
 

Citation :

fais toi ta propre idée en codant ça.


 
Mais c'est vrai que la solution la plus simple et de loin est encore de tester ça avec un paquet de valeurs aléatoires voir si parfois on trouve un résultat différent... :o


Message édité par Vinny_the_true le 22-05-2006 à 19:20:40
Reply

Marsh Posté le 22-05-2006 à 19:23:30    

c'est surtout plus precis parce que la division est reel et non euclidienne

Reply

Marsh Posté le 22-05-2006 à 19:24:42    

C'est ce que je voulais dire :)

Reply

Marsh Posté le 22-05-2006 à 19:28:34    

oui, mais quand tu fais 'x/(y*z)' il n'y a pas d'arrondi (c'est pas comme si l'operation etait faite sur des reels puis le resultat converti en entier)

Reply

Marsh Posté le 22-05-2006 à 20:20:39    

skelter a écrit :

toujours promotion vers le type le plus "large"
 
x/(y*z) -> int
x/(y*z)+0.5 -> double
(float)y*z -> float
x/((float)y*z) -> float
...


 
C'est ce qui me semblait ! :)
 

_darkalt3_ a écrit :

fais toi ta propre idée en codant ça.


 
Waip, j'avais pas de compilo sous la main. Mais je vais tester pour etre sur.
Disons que je voulais etre sur d'avoir compris les casts implicites. :o
 
Edit : Merci a tous les intervenants :)


Message édité par Tounet le 22-05-2006 à 20:29:36

---------------
Les hommes n'acceptent le changement que dans la nécessité et ils ne voient la nécessité que dans la crise.
Reply

Marsh Posté le 22-05-2006 à 20:58:53    

skelter a écrit :

oui, mais quand tu fais 'x/(y*z)' il n'y a pas d'arrondi (c'est pas comme si l'operation etait faite sur des reels puis le resultat converti en entier)


 
Bien sûr, mais il n'empêche que le résultat est le même :o . Quand je parlais d'arrondi, c'est d'un point de vue humain que je voyais la chose, pas du point de vue de la machine.

Reply

Marsh Posté le 22-05-2006 à 22:39:31    

ouai, desole, et pas la peine de s'enerver sur ce genre de truc qui existe deja (ceil, floor)

Reply

Marsh Posté le 23-05-2006 à 00:38:11    

oh, je n'étais pas énervé, désolé si j'en ai donné l'impression :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed