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