Maison >développement back-end >C++ >Pourquoi l'arithmétique à virgule flottante diffère-t-elle entre les architectures x86 et x64 ?
Différence dans l'arithmétique à virgule flottante entre x86 et x64
Lors de l'exécution d'un morceau de code identique sur MS VS 2010 pour les architectures x86 et x64 (tous deux fonctionnant sur une machine 64 bits), une différence notable dans l'arithmétique à virgule flottante est apparue.
Considérez l'extrait de 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;
Dans les versions x86 et x64, bLarger1 reste false (d est défini sur 65,0). Cependant, dans la version x64, bLarger2 est faux, tandis que dans la version x86, c'est vrai.
La divergence provient de l'expression bLarger2 = (a * c) < b. Le code généré révèle que sous x86, l'évaluation est effectuée dans l'unité x87, qui fonctionne à une précision supérieure à la simple précision (généralement double précision), alors que sous x64, l'évaluation est effectuée dans l'unité x64, qui effectue des opérations en simple précision pure. -calculs de précision.
Pour garantir que l'unité 32 bits effectue des calculs en simple précision, le mot de contrôle suivant peut être défini :
_controlfp(_PC_24, _MCW_PC);
Cela entraînera la définition des deux booléens sur false dans le programme 32 bits.
Le problème sous-jacent provient de la différence inhérente entre les unités à virgule flottante x87 et SSE. L'unité x87 utilise des instructions identiques pour les types simple et double précision, tandis que l'unité SSE utilise des instructions distinctes pour chacun. Par conséquent, le compilateur peut exercer plus de contrôle sur la précision des calculs dans l'unité SSE.
Dans l'ensemble, la disparité entre l'arithmétique à virgule flottante x86 et x64 provient des modes de fonctionnement des unités à virgule flottante respectives. Pour garantir un comportement cohérent, il est recommandé d'explorer les options permettant de persuader le compilateur d'émettre des instructions SSE même pour les cibles 32 bits.
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!