Mengapa Keputusan Titik Terapung Berbeza Dengan Pengoptimuman dalam Penyusun Berbeza?

Susan Sarandon
Lepaskan: 2024-11-11 00:10:03
asal
917 orang telah melayarinya

Why Do Floating-Point Results Differ With Optimization in Different Compilers?

Hasil Titik Terapung Berbeza dengan Pengoptimuman: Pepijat Pengkompil atau Gelagat Jangkaan?

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.

Ketepatan Dalaman pada Pemproses Intel x86

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.

Pengoptimuman dan Storan Titik Terapung

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.

Menyelesaikan Isu

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.

VS2008 lwn. g

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 .

Menggunakan -float-store: Amalan Disyorkan

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.

Pertimbangan Tambahan

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!

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