L'extrait de code fourni démontre une différence dans les résultats de calcul à virgule flottante lors de l'utilisation de l'optimisation sur différents compilateurs . Sur Visual Studio 2008 et g sans optimisation, le code produit le résultat attendu. Cependant, avec l'optimisation g activée (O1 - O3), les résultats sont incorrects.
Pour comprendre la cause première de ce comportement, il est essentiel de noter qu'Intel Les processeurs x86 gèrent en interne les calculs à virgule flottante en utilisant une précision étendue de 80 bits. En revanche, le type de données double en C a généralement une largeur de 64 bits.
Les niveaux d'optimisation influencent la fréquence à laquelle les valeurs à virgule flottante du processeur sont stockées dans mémoire. Cela peut entraîner des erreurs d'arrondi lorsque les valeurs sont converties d'une précision de 80 bits à une précision de 64 bits pendant le stockage.
Pour garantir des résultats en virgule flottante cohérents entre les niveaux d'optimisation, gcc fournit l'option -ffloat-store. En utilisant cette option, les valeurs à virgule flottante sont toujours stockées en mémoire, évitant ainsi toute erreur d'arrondi causée par le stockage des registres.
Alternativement, en utilisant le type de données long double, qui a généralement une largeur de 80 bits sur gcc, peut éliminer complètement le problème d'arrondi.
Il est intriguant que Visual Studio 2008 fournisse résultats corrects même avec la précision étendue en virgule flottante activée. Cela suggère que VS2008 gère l'arrondi et l'optimisation différemment par rapport à g .
Bien qu'il ne soit pas strictement nécessaire d'utiliser -ffloat-store, il est recommandé lors du ciblage systèmes qui utilisent en interne une précision étendue en virgule flottante pour garantir un comportement prévisible à travers les niveaux d'optimisation.
Pour les versions x86_64, ce problème ne se pose pas car les compilateurs utilisent les registres SSE pour float et double par défaut, éliminant ainsi l'utilisation de la précision étendue. L'option -mfpmath du compilateur gcc vous permet de contrôler ce comportement.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!