bienvenue au monde des nombres flottants et de leur représentation approchée
le cast d'un flottant vers un int consiste à tronquer la partie fractionnaire (donc arrondi vers 0).
dans un cas tu tronques un double (d) dont la représentation (64 bits IEEE754) est visiblement >= 360 et < 361 (et donc tu récupères 360)
dans l'autre tu tronques le résultat d'une opération de multiplication entre doubles dont la structure interne peut (et visiblement c'est le cas) être plus précise qu'un double (parfois c'est 80bits, parfois 128, etc.) et qui dépend du compilo, de ta plateforme et de l'age du capitaine. Dans cette représentation temporaire, (a*b*c) est visiblement >= 359 et < 360.
Essaie donc de faire : (int)((double)(a*b*c)) et je suppute un petit 360.
Autre solution plus simple, lorsqu'on veut arrondir (mais je ne m'avance pas trop ce n'est pas forcément ce que tu veux faire ici) on fait plutôt (int)(x + 0.5) pour x >= 0
# c'est normal
Posté par aedrin . En réponse au journal Le Pourquoi Windows plante !. Évalué à 10.
le cast d'un flottant vers un int consiste à tronquer la partie fractionnaire (donc arrondi vers 0).
dans un cas tu tronques un double (d) dont la représentation (64 bits IEEE754) est visiblement >= 360 et < 361 (et donc tu récupères 360)
dans l'autre tu tronques le résultat d'une opération de multiplication entre doubles dont la structure interne peut (et visiblement c'est le cas) être plus précise qu'un double (parfois c'est 80bits, parfois 128, etc.) et qui dépend du compilo, de ta plateforme et de l'age du capitaine. Dans cette représentation temporaire, (a*b*c) est visiblement >= 359 et < 360.
Essaie donc de faire : (int)((double)(a*b*c)) et je suppute un petit 360.
Autre solution plus simple, lorsqu'on veut arrondir (mais je ne m'avance pas trop ce n'est pas forcément ce que tu veux faire ici) on fait plutôt (int)(x + 0.5) pour x >= 0
Je t'invite à (re)lire "What Every Computer Scientist Should Know About Floating-Point Arithmetic" : http://www.physics.ohio-state.edu/~dws/grouplinks/floating_p(...)