Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1709 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Conversion de types en C

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Conversion de types en C

n°1372349
Tounet
I love apples
Posté le 22-05-2006 à 16:45:10  profilanswer
 

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.
mood
Publicité
Posté le 22-05-2006 à 16:45:10  profilanswer
 

n°1372351
_darkalt3_
Proctopathe
Posté le 22-05-2006 à 16:50:35  profilanswer
 

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

n°1372358
Tounet
I love apples
Posté le 22-05-2006 à 17:01:46  profilanswer
 

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.
n°1372363
_darkalt3_
Proctopathe
Posté le 22-05-2006 à 17:04:37  profilanswer
 

c'est quoi ton but ?
 

n°1372369
Tounet
I love apples
Posté le 22-05-2006 à 17:08:54  profilanswer
 

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.
n°1372377
_darkalt3_
Proctopathe
Posté le 22-05-2006 à 17:14:53  profilanswer
 

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

n°1372385
Emmanuel D​elahaye
C is a sharp tool
Posté le 22-05-2006 à 17:19:24  profilanswer
 

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/
n°1372393
Tounet
I love apples
Posté le 22-05-2006 à 17:31:09  profilanswer
 

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.
n°1372435
bjone
Insert booze to continue
Posté le 22-05-2006 à 18:18:31  profilanswer
 

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

n°1372436
skelter
Posté le 22-05-2006 à 18:18:39  profilanswer
 

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
...

mood
Publicité
Posté le 22-05-2006 à 18:18:39  profilanswer
 

n°1372454
_darkalt3_
Proctopathe
Posté le 22-05-2006 à 18:50:54  profilanswer
 

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.

n°1372469
Vinny_the_​true
Posté le 22-05-2006 à 19:19:02  profilanswer
 

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
n°1372473
skelter
Posté le 22-05-2006 à 19:23:30  profilanswer
 

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

n°1372474
Vinny_the_​true
Posté le 22-05-2006 à 19:24:42  profilanswer
 

C'est ce que je voulais dire :)

n°1372477
skelter
Posté le 22-05-2006 à 19:28:34  profilanswer
 

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)

n°1372513
Tounet
I love apples
Posté le 22-05-2006 à 20:20:39  profilanswer
 

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.
n°1372550
Vinny_the_​true
Posté le 22-05-2006 à 20:58:53  profilanswer
 

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.

n°1372656
skelter
Posté le 22-05-2006 à 22:39:31  profilanswer
 

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

n°1372742
Vinny_the_​true
Posté le 23-05-2006 à 00:38:11  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Conversion de types en C

 

Sujets relatifs
De la conversion des .PSD en HTMLconversion hexa ascii pour écrire dans un fichier [RESOLU]
Conversion Pantone => Hexadecimal[Débutant]générer un tableau contenant des valeurs de différents types
conversion pixel en cmarticle sur les types en Python + question
conversion HTML vers PDFConversion String en Hexa ("1F") vers byte
Conversion, Fichier Binaire->Chaine Hexa string->Fichier Binaireconversion caracteres en ascii
Plus de sujets relatifs à : Conversion de types en C


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR