Je suis à la recherche dans why a test case is failingdifférence d'arrondi gcc entre les versions
Le test problématique peut être réduit à faire (4.0/9.0) ** (1.0/2.6)
, arrondir ce à 6 chiffres et vérification par rapport à une valeur connue (sous forme de chaîne):
#include<stdio.h>
#include<math.h>
int main(){
printf("%.06f\n", powf(4.0/9.0, (1.0/2.6)));
}
Si je compiler et exécuter ce dans gcc 4.1.2 sur Linux, je reçois:
0.732057
Python est d'accord, tout comme Wolfram|Alpha:
$ python2.7 -c 'print "%.06f" % (4.0/9.0)**(1/2.6)'
0.732057
Cependant, je reçois le résultat suivant sur gcc 4.4.0 sur Linux et 4.2.1 sur Mac OS X:
0.732058
A double
actes identique (bien que je n'ai pas testé ce largement)
Je ne suis pas sûr de savoir comment réduire encore plus. Est-ce une régression gcc? Un changement d'algorithme d'arrondi? Moi qui fais quelque chose de stupide?
Edit: Impression du résultat à 12 chiffres, le chiffre à la 7ème place est 4 vs 5, ce qui explique la différence d'arrondi, mais pas la différence de valeur:
gcc 4.1.2:
0.732057452202
gcc 4.4.0:
0.732057511806
est ici la sortie gcc -S
des deux versions: https://gist.github.com/1588729
Pour supprimer 'printf()' se comportant différemment en tant que variable, imprimez ou inspectez les bits de la mémoire contenant la valeur, de façon à supprimer la partie "convertir en chaîne" de l'article. – unwind
La différence entre ces deux est exactement la [machine epsilon] (http://en.wikipedia.org/wiki/Machine_epsilon) d'un processeur 32 bits. Le résultat de gcc4.4 est également plus proche de la valeur réelle de l'expression. –