Mengapa aritmetik titik terapung menghasilkan hasil yang berbeza antara seni bina x86 dan x64?

Barbara Streisand
Lepaskan: 2024-11-03 03:12:29
asal
944 orang telah melayarinya

Why does floating-point arithmetic produce different results between x86 and x64 architectures?

Percanggahan dalam Aritmetik Titik Terapung: x86 lwn. x64

Dalam coretan kod yang melibatkan aritmetik titik terapung, ketidakkonsistenan timbul antara MS VS Binaan 2010 menyasarkan seni bina x86 dan x64. Kodnya adalah seperti berikut:

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;
Salin selepas log masuk

Percanggahan:

  • x86 Binaan: Pembolehubah bLarger1 adalah palsu (kedua-dua d dan b ditetapkan kepada 65.0), manakala bLarger2 adalah benar.
  • x64 Binaan: Kedua-dua bLarger1 dan bLarger2 adalah palsu.

Isu Dasar:

Percanggahan berpunca daripada ungkapan bool bLarger2 = (a*c) < b;. Walaupun nampaknya mewakili perbandingan yang sama seperti bool bLarger1 = d < b, ia sebenarnya melakukan pendaraban dan perbandingan secara berasingan.

Perbezaan dalam Unit Titik Terapung:

Perbezaan utama terletak pada unit titik terapung yang digunakan oleh kedua-dua seni bina. Seni bina x86 menggunakan unit titik terapung x87, yang melakukan pengiraan pada ketepatan yang lebih tinggi daripada ketepatan tunggal (biasanya ketepatan dua kali). Sebaliknya, seni bina x64 menggunakan unit titik terapung SSE, yang melakukan pengiraan ketepatan tunggal tulen.

Kesan pada Pendaraban:

Dalam ungkapan bLarger1, pendaraban a dan c dilakukan oleh arahan darab perkakasan. Arahan ini menggunakan ketepatan kepersisan dua kali, menyebabkan d ditetapkan kepada 65.0.

Walau bagaimanapun, dalam ungkapan bLarger2, pendaraban dilakukan secara eksplisit dalam ketepatan tunggal disebabkan penukaran jenis (a*c). Ini menyebabkan (a*c) ditetapkan kepada 64.999992.

Kawalan Ketepatan x87:

Secara lalai, unit x87 beroperasi pada ketepatan dua kali. Walau bagaimanapun, adalah mungkin untuk memujuk unit untuk melakukan pengiraan ketepatan tunggal menggunakan fungsi _controlfp.

_controlfp(_PC_24, _MCW_PC);
Salin selepas log masuk

Dengan menambahkan baris ini pada kod 32-bit, kedua-dua bLarger1 dan bLarger2 akan ditetapkan kepada palsu.

Pilihan Pengkompil:

Dalam versi Visual Studio yang lebih terkini, pengkompil mungkin mengeluarkan arahan SSE walaupun untuk sasaran 32-bit. Ini memastikan ketekalan dalam aritmetik titik terapung merentas seni bina yang berbeza.

Atas ialah kandungan terperinci Mengapa aritmetik titik terapung menghasilkan hasil yang berbeza antara seni bina x86 dan x64?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan