Coretan kod yang disediakan menunjukkan percanggahan dalam hasil pengiraan titik terapung apabila menggunakan pengoptimuman pada penyusun berbeza . Pada Visual Studio 2008 dan g tanpa pengoptimuman, kod menghasilkan output yang diharapkan. Walau bagaimanapun, dengan pengoptimuman g didayakan (O1 - O3), ia mempamerkan hasil yang salah.
Untuk memahami punca kelakuan ini, adalah penting untuk ambil perhatian bahawa Intel pemproses x86 mengendalikan pengiraan titik terapung secara dalaman menggunakan ketepatan lanjutan 80-bit. Sebaliknya, jenis data berganda dalam C biasanya mempunyai lebar 64 bit.
Tahap pengoptimuman mempengaruhi kekerapan nilai titik terapung daripada CPU disimpan dalam ingatan. Ini boleh membawa kepada ralat pembundaran apabila nilai ditukar daripada ketepatan 80-bit kepada ketepatan 64-bit semasa penyimpanan.
Untuk memastikan hasil titik terapung yang konsisten merentas tahap pengoptimuman, gcc menyediakan pilihan -float-store. Dengan menggunakan pilihan ini, nilai titik terapung sentiasa disimpan dalam ingatan, menghalang sebarang ralat pembundaran yang disebabkan oleh storan daftar.
Sebagai alternatif, menggunakan jenis data berganda panjang, yang biasanya mempunyai lebar 80 bit pada gcc, boleh menghapuskan isu pembundaran sama sekali.
Ia menarik bahawa Visual Studio 2008 memberikan hasil yang betul walaupun dengan ketepatan titik terapung lanjutan didayakan. Ini menunjukkan bahawa VS2008 mengendalikan pembundaran dan pengoptimuman secara berbeza berbanding dengan g .
Walaupun tidak perlu menggunakan -float-store, adalah disyorkan apabila menyasarkan sistem yang menggunakan ketepatan titik terapung lanjutan secara dalaman untuk memastikan gelagat boleh diramal merentas pengoptimuman peringkat.
Untuk binaan x86_64, isu ini tidak timbul kerana pengkompil menggunakan daftar SSE untuk apungan dan berganda secara lalai, menghapuskan penggunaan ketepatan lanjutan. Pilihan pengkompil gcc -mfpmath membolehkan anda mengawal tingkah laku ini.
Atas ialah kandungan terperinci Mengapa Keputusan Titik Terapung Berbeza Dengan Pengoptimuman dalam Penyusun Berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!