"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Pourquoi l’arithmétique à virgule flottante diffère-t-elle entre x86 et x64 dans Visual Studio 2010 ?

Pourquoi l’arithmétique à virgule flottante diffère-t-elle entre x86 et x64 dans Visual Studio 2010 ?

Publié le 2024-11-15
Parcourir:717

Why does floating-point arithmetic differ between x86 and x64 in Visual Studio 2010?

Différence arithmétique à virgule flottante entre x86 et x64

Dans Visual Studio 2010, une différence notable dans l'arithmétique à virgule flottante entre les versions x86 et x64 se produit lors de la comparaison des valeurs de certaines expressions. Cette disparité se manifeste dans le code suivant :

float a = 50.0f;
float b = 65.0f;
float c = 1.3f;
float d = a * c;
bool bLarger1 = d 

Les architectures x86 et x64 gèrent la deuxième expression, bLarger2, différemment. Dans la version x86, bLarger2 est évalué à vrai, tandis que dans la version x64, il est évalué à faux. Cette disparité est enracinée dans le calcul de l'expression (a * c) dans les opérations à virgule flottante.

Origines de la disparité

La racine de l'écart réside dans les différentes unités à virgule flottante utilisées par les deux architectures : x87 pour x86 et SSE pour x64. La différence fondamentale entre les deux unités est leur précision. L'unité x87 utilise par défaut une précision supérieure à la simple précision (généralement une double précision), tandis que l'unité SSE fonctionne exclusivement en simple précision.

Résolution de l'écart

Pour résoudre le problème En cas de divergence, la précision de l'unité x87 peut être configurée manuellement pour correspondre à celle de l'unité SSE. Ceci peut être réalisé dans un code 32 bits en exécutant ce qui suit :

_controlfp(_PC_24, _MCW_PC);

En définissant la précision sur simple précision, l'évaluation de (a * c) dans l'expression bLarger2 s'alignera sur celle de la version x64, ce qui fera que bLarger1 et bLarger2 seront définis sur false.

Conclusion

La différence dans l'arithmétique à virgule flottante entre Les versions x86 et x64 proviennent des niveaux de précision distincts des unités à virgule flottante x87 et SSE. En contrôlant manuellement la précision de l'unité x87 pour qu'elle corresponde à celle de l'unité SSE, l'écart peut être éliminé, garantissant ainsi une évaluation cohérente des expressions dans les deux architectures.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3