mon compilo a un bleme ou chuis ouf? - Programmation
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.
Marsh Posté le 31-05-2002 à 08:15:32
taka caster le résultat en float :
K = (float)(variation/t);
on ne sait jamais...
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.
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]
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é!!
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!!
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 !!!
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 !
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 >
|
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!
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! |
Oui, et ton principe est le bon !
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
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...
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 >
|
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.....
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 !
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
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.
Marsh Posté le 05-06-2002 à 00:15:26
Plop, code generé par visual :
Citation : |
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) (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)
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