Maison > développement back-end > C++ > le corps du texte

Pourquoi les résultats en virgule flottante diffèrent-ils selon l'optimisation dans différents compilateurs ?

Susan Sarandon
Libérer: 2024-11-11 00:10:03
original
917 Les gens l'ont consulté

Why Do Floating-Point Results Differ With Optimization in Different Compilers?

Différents résultats à virgule flottante avec optimisation : bug du compilateur ou comportement attendu ?

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.

Précision interne sur les processeurs Intel x86

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.

Optimisation et stockage à virgule flottante

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.

Résoudre le problème

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.

VS2008 vs. g

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 .

Utilisation de -ffloat-store : pratique recommandée

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.

Supplémentaire Considérations

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal