Ketaksamaan Pembundaran Titik Terapung dengan Pengoptimuman Didayakan: Pepijat Pengkompil atau Dilema Pengoptimuman?
Pengiraan titik terapung selalunya boleh menunjukkan tingkah laku yang tidak dijangka, terutamanya apabila pengoptimuman pengkompil didayakan. Pertimbangkan coretan kod berikut:
#include <cstdlib> #include <iostream> #include <cmath> double round(double v, double digit) { double pow = std::pow(10.0, digit); double t = v * pow; double r = std::floor(t + 0.5); return r / pow; } int main() { std::cout << round(4.45, 1) << std::endl; std::cout << round(4.55, 1) << std::endl; }
Output yang dijangkakan:
4.5 4.6
Walau bagaimanapun, apabila kod ini disusun menggunakan g dengan pengoptimuman (O1 - O3), output menjadi:
4.5 4.5
Punca Perbezaan:
Ketidakkonsistenan ini berpunca daripada fakta bahawa pemproses x86 secara dalaman menggunakan ketepatan lanjutan 80-bit untuk pengiraan titik terapung. Walau bagaimanapun, pembolehubah berganda biasanya lebar 64-bit. Apabila nilai titik terapung disimpan daripada daftar CPU ke memori, ia dibundarkan daripada ketepatan 80-bit kepada ketepatan 64-bit. Pembundaran ini boleh memperkenalkan sedikit ralat.
Kesan Tahap Pengoptimuman:
Tahap pengoptimuman yang berbeza boleh menjejaskan kekerapan nilai titik terapung disimpan ke dalam ingatan. Dengan tahap pengoptimuman yang lebih tinggi, ini berlaku lebih kerap. Akibatnya, ralat pembundaran menjadi lebih ketara.
Penyelesaian:
Pertimbangan Lanjut:
Atas ialah kandungan terperinci Mengapa Kod Pembundaran Titik Terapung Saya Menghasilkan Keputusan Berbeza dengan Pengoptimuman Pengkompil Didayakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!