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;
Percanggahan:
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);
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!