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

  FORUM HardWare.fr
  Programmation

  mon compilo a un bleme ou chuis ouf?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

mon compilo a un bleme ou chuis ouf?

n°148312
apolon34
Vive Linux!!
Posté le 31-05-2002 à 07:59:09  profilanswer
 

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

mood
Publicité
Posté le 31-05-2002 à 07:59:09  profilanswer
 

n°148313
gfive
Posté le 31-05-2002 à 08:08:54  profilanswer
 

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

n°148314
torpe23
Posté le 31-05-2002 à 08:15:32  profilanswer
 

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

n°148315
gfive
Posté le 31-05-2002 à 08:21:17  profilanswer
 

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.

n°148316
apolon34
Vive Linux!!
Posté le 31-05-2002 à 08:21:25  profilanswer
 

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]

n°148317
gfive
Posté le 31-05-2002 à 08:23:33  profilanswer
 

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

n°148318
apolon34
Vive Linux!!
Posté le 31-05-2002 à 08:25:18  profilanswer
 

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

n°148327
darkoli
Le Petit Dinosaure Bleu
Posté le 31-05-2002 à 08:54:48  profilanswer
 

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
n°148446
BENB
100% Lux.
Posté le 31-05-2002 à 11:16:27  profilanswer
 

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 !

n°148448
gfive
Posté le 31-05-2002 à 11:18:34  profilanswer
 

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

mood
Publicité
Posté le 31-05-2002 à 11:18:34  profilanswer
 

n°148453
BENB
100% Lux.
Posté le 31-05-2002 à 11:20:31  profilanswer
 

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 !

n°148462
LeGreg
Posté le 31-05-2002 à 11:23:55  profilanswer
 

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

n°148923
apolon34
Vive Linux!!
Posté le 01-06-2002 à 00:40:19  profilanswer
 

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

n°148929
chrisbk
-
Posté le 01-06-2002 à 02:00:08  profilanswer
 

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

n°150040
BENB
100% Lux.
Posté le 03-06-2002 à 15:39:38  profilanswer
 

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 !

n°150145
LeGreg
Posté le 03-06-2002 à 16:36:05  profilanswer
 

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

n°150156
BENB
100% Lux.
Posté le 03-06-2002 à 16:41:57  profilanswer
 

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.

n°151417
chrisbk
-
Posté le 05-06-2002 à 00:15:26  profilanswer
 

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

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

  mon compilo a un bleme ou chuis ouf?

 

Sujets relatifs
[Ada (si! si!)] compilo / Object Ada?[C] C moa ou c mon compilo
compilo C++ SSE[algorithme] chuis bloqué pour la table des successeurs (KMP)
[Chuis une merde en C] Comment on fait ce truc de newb inside[PHP / MySQL] TIMESTAMP , piti blème, vous savez surement!!!!! aidez;)
[HTML] Blème débilecherche compilo C qui soit le meme sous linux et windows
[phpBB] chuis un peu dégouté...un petit bléme de compteur !
Plus de sujets relatifs à : mon compilo a un bleme ou chuis ouf?


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