Maison  >  Article  >  développement back-end  >  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 ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-01 05:04:27181parcourir

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 < b;
bool bLarger2 = (a * c) < b;

Les architectures x86 et x64 gèrent différemment la deuxième expression, bLarger2. 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 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 du x64 build, ce qui fait que bLarger1 et bLarger2 sont définis sur false.

Conclusion

La différence dans l'arithmétique à virgule flottante entre les versions x86 et x64 provient 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.

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!

Déclaration:
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