mon compilo a un bleme ou chuis ouf?

mon compilo a un bleme ou chuis ouf? - Programmation

Marsh Posté le 31-05-2002 à 07:59:09    

j'ai un code qui ressemble a ca:
 
int variation profondeur, t;
float K;
 
variation_profondeur = 40;
t = 100;
 
K = variatiion_profondeur / t;
printf("K: %f\n", K);
 
il me sort ca:
K: 0.000000
 
ca me fait chier, j'arrive pas a lui faire afficher une valeur correcte a ce con!!
 
compilo: gcc 3.1, glibc 2.2.5

Reply

Marsh Posté le 31-05-2002 à 07:59:09   

Reply

Marsh Posté le 31-05-2002 à 08:08:54    

bah, si t et variationprofondeur sont des entiers, y'a une chance non négligeable qu'il fasse une division euclidienne.

Reply

Marsh Posté le 31-05-2002 à 08:15:32    

taka caster le résultat en float :
 
K = (float)(variation/t);
 
on ne sait jamais...

Reply

Marsh Posté le 31-05-2002 à 08:21:17    

ouais, je pense que ça va pas marcher : la division euclidienne de 40 par 100, ça fait toujours 0, et casté en float, ça fait aussi 0....
Enfin, si ça marche pas, normalement, un  
 
K= (float)variatiion_profondeur / (float)t;  
 
devrait le faire.

Reply

Marsh Posté le 31-05-2002 à 08:21:25    

ouaip je vais tenter ca
 
par contre je pensais qu'il le faisait tout seul le cast en float...
 
edit: ca le fait en castant, merci !!!
 
n'empeche qu'il pourrait le faire tt seul ce con

 

[jfdsdjhfuetppo]--Message édité par apolon34 le 31-05-2002 à 08:23:33--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 31-05-2002 à 08:23:33    

baaah...Ca se discute, le cast tout seul....Disons que si il le faisait, et que tu le voulais pas, tu serais emmerdé!! :D

Reply

Marsh Posté le 31-05-2002 à 08:25:18    

bah je pourrais toujours specifier que je veux pas.....
 
enfin bref maintenant je saurais comment faire!!

Reply

Marsh Posté le 31-05-2002 à 08:54:48    

apolon34 a écrit a écrit :

ouaip je vais tenter ca
par contre je pensais qu'il le faisait tout seul le cast en float...
edit: ca le fait en castant, merci !!!
n'empeche qu'il pourrait le faire tt seul ce con




 
Oui mais defois tu n'as pas envie qu'il le fasse !!!


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 31-05-2002 à 11:16:27    

apolon34 a écrit a écrit :

ouaip je vais tenter ca
 
par contre je pensais qu'il le faisait tout seul le cast en float...
 
edit: ca le fait en castant, merci !!!
 
n'empeche qu'il pourrait le faire tt seul ce con
 




 
Non car la syntaxe du langage est de faire une division entiere...
 
gfive >

Citation :

K= (float)variatiion_profondeur / (float)t;  


est une solution mais n'est sans doute pas la meilleure. Des cast en double, puis un cast en float serait a mon avis mieux puisque de toute maniere la division se fera en double, c'est a dir que tes float seront de toute maniere castés en double par le compilo avant la division !

Reply

Marsh Posté le 31-05-2002 à 11:18:34    

BENB a écrit a écrit :

 
 
Non car la syntaxe du langage est de faire une division entiere...
 
gfive >

Citation :

K= (float)variatiion_profondeur / (float)t;  


est une solution mais n'est sans doute pas la meilleure. Des cast en double, puis un cast en float serait a mon avis mieux puisque de toute maniere la division se fera en double, c'est a dir que tes float seront de toute maniere castés en double par le compilo avant la division !  




 
Ouais, bah ça, je sais pas, disons que je proposais un principe, quoi...J'ai pas fait de c depuis très très longtemps! :D

Reply

Marsh Posté le 31-05-2002 à 11:18:34   

Reply

Marsh Posté le 31-05-2002 à 11:20:31    

gfive a écrit a écrit :

 
 
Ouais, bah ça, je sais pas, disons que je proposais un principe, quoi...J'ai pas fait de c depuis très très longtemps! :D  




Oui, et ton principe est le bon !

Reply

Marsh Posté le 31-05-2002 à 11:23:55    

un seul (float) suffit.
 
ex: K = (float) v / t;
ou K = v / (float) t;
 
bon ca ne coute pas grand chose de caster les deux mais bon :)
 
LeGreg

Reply

Marsh Posté le 01-06-2002 à 00:40:19    

Bah du moment que ca marche .....
 
en tout cas j'ai cherche un bon moment comme un con...

Reply

Marsh Posté le 01-06-2002 à 02:00:08    

BENB a écrit a écrit :

 
 
Non car la syntaxe du langage est de faire une division entiere...
 
gfive >

Citation :

K= (float)variatiion_profondeur / (float)t;  


est une solution mais n'est sans doute pas la meilleure. Des cast en double, puis un cast en float serait a mon avis mieux puisque de toute maniere la division se fera en double, c'est a dir que tes float seront de toute maniere castés en double par le compilo avant la division !



 
je crois pas trop, non, je joue pas mal avec le code generé de visual ces tps ci et a / b (avec a et b etant des float) ne genere aucun cast dans le code pondu.....

Reply

Marsh Posté le 03-06-2002 à 15:39:38    

chrisbk a écrit a écrit :

 
 
je crois pas trop, non, je joue pas mal avec le code generé de visual ces tps ci et a / b (avec a et b etant des float) ne genere aucun cast dans le code pondu.....  




normalement toute l'arithmetique du C est en double...
donc a/b avec a et b float est execute en double...
 
Après que Visual s'ecarte du standard, ce ne serait pas la premiere fois !

Reply

Marsh Posté le 03-06-2002 à 16:36:05    

BENB a écrit a écrit :

 
normalement toute l'arithmetique du C est en double...
donc a/b avec a et b float est execute en double...
Après que Visual s'ecarte du standard, ce ne serait pas la premiere fois !  




 
1er cas: a et b sont des float, a/b est en double, je le mets dans un float (cast)
2e cas: a et b sont des float, a/b est en float, je le mets dans un float (pas de cast)
=> le resultat est le meme, il me semble.
 
et s'il ne l'est pas c'est parce qu'on tombe dans la twilight zone (implementation specific..).
 
LeGreg

Reply

Marsh Posté le 03-06-2002 à 16:41:57    

legreg a écrit a écrit :

 
 
1er cas: a et b sont des float, a/b est en double, je le mets dans un float (cast)
2e cas: a et b sont des float, a/b est en float, je le mets dans un float (pas de cast)
=> le resultat est le meme, il me semble.
 
et s'il ne l'est pas c'est parce qu'on tombe dans la twilight zone (implementation specific..).
 
LeGreg  




 
La norme est que l'arithmetique flottante est en double uniquement, donc si a et b sont des floats, ils sont convertis en doubles avant l'execution de la division, le resultat double etant converti en float pour l'affectation.
 
Après tous les compilo ne suivent pas la norme...
 
Je ne dis pas que ce que tu dis est faux, mais simplement que compte tenu de cette particularite, il est aussi simple de caster directement en double plutot qu'en float.
 
point.

Reply

Marsh Posté le 05-06-2002 à 00:15:26    

Plop, code generé par visual :
 

Citation :


21:       double a,b;
22:       float c,d;
23:
24:       a = a/b;
0040141E DD 45 F8             fld         qword ptr [ebp-8]
00401421 DC 75 F0             fdiv        qword ptr [ebp-10h]
00401424 DD 5D F8             fstp        qword ptr [ebp-8]
25:       c = c/d;
00401427 D9 45 EC             fld         dword ptr [ebp-14h]
0040142A D8 75 E8             fdiv        dword ptr [ebp-18h]
0040142D D9 5D EC             fstp        dword ptr [ebp-14h]


 
et quand on sait que :

Citation :

The fld instruction loads a 32 bit, 64 bit, or 80 bit floating point value onto the stack. This instruction converts 32 and 64 bit operand to an 80 bit extended precision value before pushing the value onto the floating point stack.


 
 
Alors finalement on s'interroge sur la norme (du moins pour x87) :D (vu que finalement le compilo n'a que peu a dire sur le déroulement de l'affaire, quoiqu'il fasse le calcul est fait en 80bits, juste a la sortie que ca change, et la, faut bien qu'il se plie au volonté de l'utilisateur (ici mettre le res dans un float)


Message édité par chrisbk le 06-05-2002 à 00:17:10
Reply

Sujets relatifs:

Leave a Replay

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