Manipulasi Jenis Antara Float dan Int: Pendekatan Selamat
Apabila cuba melakukan operasi antara jenis data yang berbeza, adalah penting untuk mempertimbangkan yang betul kaedah untuk mengelakkan konflik alias. Amaran daripada pengkompil GCC C mengenai tebukan taip dalam coretan kod berikut ialah contoh utama:
float InverseSquareRoot(float x) { float xhalf = 0.5f*x; int32_t i = *(int32_t*)&x; i = 0x5f3759df - (i>>1); x = *(float*)&i; x = x*(1.5f - xhalf*x*x); return x; }
Untuk menangani isu ini dan mengekalkan pematuhan alias ketat, anda disyorkan untuk menggunakan memcpy dan bukannya menghantar taip . Kod yang disemak di bawah melaksanakan kaedah ini:
float xhalf = 0.5f*x; uint32_t i; assert(sizeof(x) == sizeof(i)); std::memcpy(&i, &x, sizeof(i)); i = 0x5f375a86 - (i>>1); std::memcpy(&x, &i, sizeof(i)); x = x*(1.5f - xhalf*x*x); return x;
Pendekatan ini melibatkan penyalinan bait daripada apungan ke int32_t menggunakan memcpy. Yang penting, objek apungan tidak pernah diakses secara langsung melalui rujukan int32_t, memastikan pematuhan dengan peraturan aliasing. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa kaedah ini bergantung pada andaian bahawa saiz kedua-dua jenis adalah sama, seperti yang ditunjukkan oleh pernyataan tegas. Andaian ini benar dalam kebanyakan senario tetapi harus disahkan dalam kes tertentu.
Atas ialah kandungan terperinci Bagaimanakah Kami Boleh Memanipulasi Jenis Data Terapung dan Int dengan Selamat dalam C untuk Mengelakkan Isu Aliasi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!