Rumah >pembangunan bahagian belakang >C++ >Mengapa Aritmetik Titik Terapung dalam Seni Bina x86 dan x64 Menghasilkan Keputusan Berbeza?

Mengapa Aritmetik Titik Terapung dalam Seni Bina x86 dan x64 Menghasilkan Keputusan Berbeza?

DDD
DDDasal
2024-11-01 04:17:02574semak imbas

Why Does Floating Point Arithmetic in x86 and x64 Architectures Produce Different Results?

Memahami Percanggahan dalam Aritmetik Titik Terapung antara x86 dan x64

Dalam bidang pengaturcaraan komputer, perbezaan dalam cara aritmetik titik terapung dikendalikan antara seni bina x86 dan x64 boleh membawa kepada hasil yang tidak dijangka. Pertanyaan ini meneroka percanggahan sedemikian, khususnya melibatkan perbandingan dua nilai titik terapung dalam binaan Microsoft Visual Studio 2010.

Masalahnya

Melaksanakan coretan kod berikut dalam x86 dan x64 dibina pada mesin 64-bit yang sama mendedahkan a percanggahan:

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;

Boolean bLarger1 kekal palsu dalam kedua-dua binaan, manakala bLarger2 palsu dalam x64 tetapi benar dalam x86. Ketidakkonsistenan ini menimbulkan persoalan tentang mekanik asas aritmetik titik terapung dalam seni bina ini.

Punca

Inti masalah terletak pada penilaian ungkapan:

bool bLarger2 = (a * c) < b;

Memeriksa kod pemasangan yang dijana untuk kedua-dua x86 dan x64 mendedahkan perbezaan utama. Dalam x64, pengiraan dilakukan menggunakan arahan ketepatan tunggal tulen. Sebaliknya, x86 menggunakan unit titik terapung x87, yang beroperasi pada ketepatan yang lebih tinggi (ketepatan dua kali secara lalai).

Penjelasan

Perbezaan ini berpunca daripada perbezaan asas antara x87 FPU dan unit x64 SSE. Unit x87 menggunakan arahan yang sama untuk pengiraan ketepatan tunggal dan dua kali ganda, yang membawa kepada tahap ketepatan dalam operasi ketepatan tunggal. Sebaliknya, unit SSE menggunakan arahan yang berbeza untuk setiap ketepatan, memastikan pengiraan ketepatan tunggal yang tepat.

Penyelesaian

Untuk menyelesaikan percanggahan ini dalam 32- bit (x86), adalah mungkin untuk memaksa unit x87 melakukan pengiraan ketepatan tunggal dengan menggunakan kawalan berikut bendera:

_controlfp(_PC_24, _MCW_PC);

Ini akan mengakibatkan kedua-dua pembolehubah boolean (bLarger1 dan bLarger2) ditetapkan kepada false dalam kedua-dua binaan x86 dan x64.

Kesimpulan

Percanggahan dalam aritmetik titik terapung antara x86 dan x64 berpunca daripada perbezaan dalam unit titik terapung asas mereka. Dengan memahami perbezaan ini dan mengambil langkah yang sesuai, seperti memaksa pengiraan ketepatan tunggal dalam x86, pengaturcara boleh memastikan hasil yang tepat dan konsisten merentas seni bina yang berbeza.

Atas ialah kandungan terperinci Mengapa Aritmetik Titik Terapung dalam Seni Bina x86 dan x64 Menghasilkan Keputusan Berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn