Résultat attendu : 0 (c'est le cas en GCC 4.4)
Résultat obtenu : -2.77556e-17 (GCC 2.95 à 4.0 au moins, sur x86)
Palliatifs : déclarer sum comme volatile et utiliser -ffloat-store (Do not store floating point variables in registers, and inhibit other options that might change whether a floating point value is taken from a register or memory.)
Codage en binaire (IEEE float 32 bits, double 64 bits, long double 80 bits), prenons le cas des float par exemple :
Le problème rencontré est dû à la précision excessive dans l'unité de calcul en virgule flottante (FPU). Les calculs en interne sont plus précis que les résultats renvoyés.
[^] # Re: Autre méthode
Posté par Benoît Sibaud (site web personnel) . En réponse à la dépêche Dans les kiosques cet été 2011. Évalué à 5.
C'est pire que cela en fait, cf le bug 323 ouvert depuis 11 ans chez GCC, et qui va le rester, le flottant peut passer par les registres plus précis de la FPU aussi...
Résultat attendu : 0 (c'est le cas en GCC 4.4)
Résultat obtenu : -2.77556e-17 (GCC 2.95 à 4.0 au moins, sur x86)
Palliatifs : déclarer sum comme volatile et utiliser -ffloat-store (Do not store floating point variables in registers, and inhibit other options that might change whether a floating point value is taken from a register or memory.)
Codage en binaire (IEEE float 32 bits, double 64 bits, long double 80 bits), prenons le cas des float par exemple :
Le problème rencontré est dû à la précision excessive dans l'unité de calcul en virgule flottante (FPU). Les calculs en interne sont plus précis que les résultats renvoyés.