J'en pense comme vous qu'il y a certainement une erreur, et je ne pense pas qu'il s'agisse d'un bug en ce sens que cette erreur est certainement assumée et connue des habitués. Mais je n'ai pas trop envie de me jeter dans la norme ni dans les documentations de gcc ni de msvc, surtout à l'heure de la messe ou du petit blanc du dimanche matin.
J'ai testé avec Visual Studio Express. En 32bit, j'obtiens (j'ajoute des sizeof, à toutes fins utiles):
Il est clair que le cast (float) dans le printf() est zappé. Ce ne serait pas immédiat, mais pas la mer à boire quand même. On voit également en germe un autre souci potentiel, c'est que les calculs sur des float sans autre précaution risquent d'être menés au moins en partie sur des double, en fait des extended. Il me semble que c'est documenté abondamment.
Maintenant en 64bit (le compilateur est différent):
Là, le forçage en float est fait. A cause d'un modèle garanti plus riche, le code pour le faire est plus carré. Il n'y a pas grand chose à commenter, si ce n'est que le fait que la version la plus récente du compilateur respecte le cast montre bien que c'est ce qu'il faut faire.
Je remarque aussi que j'avais écrit une bêtise en suggérant que tout ça pouvait dépendre des bibliothèques dynamiques. Comme on alimente printf() avec un double, c'est le compilateur qui décide s'il caste ou non.
-- Pierre Maurette
rixed@apc.happyleptic.org, le 13/09/2009 a écrit :
[...]
Qu'en pensez vous ?
J'en pense comme vous qu'il y a certainement une erreur, et je ne pense
pas qu'il s'agisse d'un bug en ce sens que cette erreur est
certainement assumée et connue des habitués. Mais je n'ai pas trop
envie de me jeter dans la norme ni dans les documentations de gcc ni de
msvc, surtout à l'heure de la messe ou du petit blanc du dimanche
matin.
J'ai testé avec Visual Studio Express. En 32bit, j'obtiens (j'ajoute
des sizeof, à toutes fins utiles):
Il est clair que le cast (float) dans le printf() est zappé. Ce ne
serait pas immédiat, mais pas la mer à boire quand même. On voit
également en germe un autre souci potentiel, c'est que les calculs sur
des float sans autre précaution risquent d'être menés au moins en
partie sur des double, en fait des extended. Il me semble que c'est
documenté abondamment.
Maintenant en 64bit (le compilateur est différent):
Là, le forçage en float est fait. A cause d'un modèle garanti plus
riche, le code pour le faire est plus carré. Il n'y a pas grand chose à
commenter, si ce n'est que le fait que la version la plus récente du
compilateur respecte le cast montre bien que c'est ce qu'il faut faire.
Je remarque aussi que j'avais écrit une bêtise en suggérant que tout ça
pouvait dépendre des bibliothèques dynamiques. Comme on alimente
printf() avec un double, c'est le compilateur qui décide s'il caste ou
non.
J'en pense comme vous qu'il y a certainement une erreur, et je ne pense pas qu'il s'agisse d'un bug en ce sens que cette erreur est certainement assumée et connue des habitués. Mais je n'ai pas trop envie de me jeter dans la norme ni dans les documentations de gcc ni de msvc, surtout à l'heure de la messe ou du petit blanc du dimanche matin.
J'ai testé avec Visual Studio Express. En 32bit, j'obtiens (j'ajoute des sizeof, à toutes fins utiles):
Il est clair que le cast (float) dans le printf() est zappé. Ce ne serait pas immédiat, mais pas la mer à boire quand même. On voit également en germe un autre souci potentiel, c'est que les calculs sur des float sans autre précaution risquent d'être menés au moins en partie sur des double, en fait des extended. Il me semble que c'est documenté abondamment.
Maintenant en 64bit (le compilateur est différent):
Là, le forçage en float est fait. A cause d'un modèle garanti plus riche, le code pour le faire est plus carré. Il n'y a pas grand chose à commenter, si ce n'est que le fait que la version la plus récente du compilateur respecte le cast montre bien que c'est ce qu'il faut faire.
Je remarque aussi que j'avais écrit une bêtise en suggérant que tout ça pouvait dépendre des bibliothèques dynamiques. Comme on alimente printf() avec un double, c'est le compilateur qui décide s'il caste ou non.
-- Pierre Maurette
Pierre Maurette
, le 13/09/2009 a écrit :
[...]
Qu'en pensez vous ?
Si c'est effectivement un problème, on peut peut-être: