Pergi: Cara Lebih Bijak untuk Membandingkan Terapung
Semasa anda menyelidiki kerumitan IEEE 754 dan perwakilan apungan binari, anda mungkin menghadapi soalan berlarutan: bagaimana untuk membandingkan dua apungan dengan tepat untuk kesamaan dalam Go. Satu pendekatan yang berpotensi adalah untuk mengkaji perbezaan tahap bit, menggunakan penyelesaian seperti ini:
func Equal(a, b float64) bool { ba := math.Float64bits(a) bb := math.Float64bits(b) diff := ba - bb if diff < 0 { diff = -diff } return diff < 2 }
Kaedah ini bertujuan untuk membenarkan perbezaan bit tunggal, menganggap ini sebagai "hampir sama." Walau bagaimanapun, pendekatan ini mempunyai had.
Pendekatan yang Lebih Berkesan
Daripada bergantung pada manipulasi bit, penyelesaian yang lebih dipercayai adalah dengan menolak terus dua nombor dan semak perbezaan mutlak terhadap ambang yang telah ditetapkan. Pendekatan ini lebih intuitif dan tepat:
const float64EqualityThreshold = 1e-9 func almostEqual(a, b float64) bool { return math.Abs(a - b) <= float64EqualityThreshold }
Mengapa Ia Superior
Kaedah ini mengelakkan perangkap perwakilan bit, yang boleh membawa kepada perbandingan yang tidak tepat dalam situasi tertentu . Dengan membandingkan secara langsung perbezaan berangka, anda memperoleh ketepatan dan ketepatan yang lebih tinggi. Selain itu, ia menghapuskan keperluan untuk memeriksa perbezaan bit secara manual, menjadikan kod lebih ringkas dan boleh diselenggara.
Ringkasnya, untuk membandingkan apungan dalam Go, pendekatan yang disyorkan ialah menolak dua nombor dan membandingkan perbezaan mutlak dengan ambang yang telah ditetapkan. Kaedah ini menyediakan cara yang lebih tepat dan cekap untuk menentukan "hampir kesamaan" berbanding manipulasi bit.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membandingkan Nombor Titik Terapung dengan Tepat untuk Kesamaan dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!