Maison développement back-end C++ Pourquoi les résultats arithmétiques à virgule flottante diffèrent-ils entre les versions x86 et x64 dans MS VS 2010 ?

Pourquoi les résultats arithmétiques à virgule flottante diffèrent-ils entre les versions x86 et x64 dans MS VS 2010 ?

Oct 31, 2024 pm 07:36 PM

Why Do Floating-Point Arithmetic Results Differ Between x86 and x64 Builds in MS VS 2010?

Différences arithmétiques à virgule flottante entre x86 et x64 dans MS VS 2010

Dans Microsoft Visual Studio 2010, les opérations arithmétiques à virgule flottante présentent des divergences entre les versions x86 et x64, même lorsqu'elles sont exécutées sur la même machine 64 bits. Cela est évident dans l'extrait de code suivant :

<code class="c++">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;</code>
Copier après la connexion

La variable booléenne bLarger1 est systématiquement fausse, d étant défini sur 65,0 dans les deux versions. Cependant, bLarger2 est faux pour x64 mais vrai pour x86.

Le coupable : x87 contre SSE

L'écart vient du fait que la version x86 utilise le x87 unité à virgule flottante (FPU) tandis que la version x64 utilise l'unité Streaming SIMD Extensions (SSE). La différence réside dans la précision des calculs.

Le FPU x87 effectue des calculs en double précision par défaut, même lors de la manipulation de valeurs en simple précision. L'unité SSE, quant à elle, effectue des calculs en simple précision pure. Par conséquent, les calculs x87 sont légèrement plus précis que les calculs SSE.

Dans ce cas, la précision accrue du FPU x87 entraîne une erreur d'arrondi qui fait que d est légèrement inférieur à 65,0. Cela rend bLarger2 faux pour x86. En revanche, le calcul SSE dans x64 produit une valeur plus précise pour d, ce qui donne une valeur vraie pour bLarger2.

Solution de contournement pour x86

Pour forcer la construction x86 pour effectuer des calculs en simple précision, la ligne suivante peut être ajoutée :

<code class="c++">_controlfp(_PC_24, _MCW_PC);</code>
Copier après la connexion

Cela définit le mot de contrôle à virgule flottante pour effectuer tous les calculs en simple précision. Avec ce changement, bLarger1 et bLarger2 seront définis sur false pour les versions x86 et x64.

Conclusion

L'écart dans l'arithmétique à virgule flottante entre x86 et x64 Les builds dans MS VS 2010 proviennent de la différence entre le FPU x87 et l'unité SSE. La précision plus élevée du FPU x87 conduit à des valeurs légèrement différentes par rapport aux véritables calculs en simple précision de l'unité SSE. En forçant les calculs en simple précision sur x86, les développeurs peuvent atténuer ce problème et garantir des résultats cohérents sur différentes plates-formes.

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 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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quels sont les types de valeurs renvoyées par les fonctions du langage C? Qu'est-ce qui détermine la valeur de retour? Quels sont les types de valeurs renvoyées par les fonctions du langage C? Qu'est-ce qui détermine la valeur de retour? Mar 03, 2025 pm 05:52 PM

Quels sont les types de valeurs renvoyées par les fonctions du langage C? Qu'est-ce qui détermine la valeur de retour?

Gulc: Cibliothèque C construite à partir de zéro Gulc: Cibliothèque C construite à partir de zéro Mar 03, 2025 pm 05:46 PM

Gulc: Cibliothèque C construite à partir de zéro

C Fonction Langue Format de lettre ÉTAPES DE CONVERSION DE CAS C Fonction Langue Format de lettre ÉTAPES DE CONVERSION DE CAS Mar 03, 2025 pm 05:53 PM

C Fonction Langue Format de lettre ÉTAPES DE CONVERSION DE CAS

Quelles sont les définitions et les règles d'appel des fonctions du langage C et quelles sont les Quelles sont les définitions et les règles d'appel des fonctions du langage C et quelles sont les Mar 03, 2025 pm 05:53 PM

Quelles sont les définitions et les règles d'appel des fonctions du langage C et quelles sont les

Où est la valeur de retour de la fonction de langue C stockée en mémoire? Où est la valeur de retour de la fonction de langue C stockée en mémoire? Mar 03, 2025 pm 05:51 PM

Où est la valeur de retour de la fonction de langue C stockée en mémoire?

Utilisation distincte et partage de phrases Utilisation distincte et partage de phrases Mar 03, 2025 pm 05:51 PM

Utilisation distincte et partage de phrases

Comment utiliser efficacement les algorithmes du STL (trier, trouver, transformer, etc.)? Comment utiliser efficacement les algorithmes du STL (trier, trouver, transformer, etc.)? Mar 12, 2025 pm 04:52 PM

Comment utiliser efficacement les algorithmes du STL (trier, trouver, transformer, etc.)?

Comment fonctionne la bibliothèque de modèle standard C (STL)? Comment fonctionne la bibliothèque de modèle standard C (STL)? Mar 12, 2025 pm 04:50 PM

Comment fonctionne la bibliothèque de modèle standard C (STL)?

See all articles