Go Float Comparison: Pendekatan Cekap untuk Hampir Kesaksamaan
Dalam Go, membandingkan dua terapung (float64) untuk kesaksamaan boleh menjadi tugas yang sukar disebabkan oleh pengehadan perwakilan titik terapung IEEE 754. Walaupun kaedah "abs(diff) < epsilon" konvensional memberikan anggaran, ia boleh membawa kepada ketidakkonsistenan.
Penyelesaian Cadangan: Perbandingan Tahap Bit
Satu cadangan penyelesaian mencadangkan membandingkan perwakilan bitwise bagi nilai float64. Rasionalnya ialah perbezaan satu bit dalam perwakilan binari memastikan hampir kesaksamaan, kerana sebarang perbezaan yang lebih besar akan menghasilkan bit atau eksponen tanda yang berbeza.
Pelaksanaan:
func Equal(a, b float64) bool { ba := math.Float64bits(a) bb := math.Float64bits(b) diff := ba - bb if diff < 0 { diff = -diff } // accept one bit difference return diff < 2 }
Penilaian:
Walaupun pendekatan ini kelihatan menjanjikan, ia merugikan daripada pengehadan:
Penyelesaian Disyorkan: Tolak Titik Terapung
Lebih dipercayai dan pendekatan yang cekap untuk hampir kesamaan adalah dengan hanya menolak dua apungan dan semak sama ada perbezaannya lebih kecil daripada yang telah ditetapkan ambang:
const float64EqualityThreshold = 1e-9 func almostEqual(a, b float64) bool { return math.Abs(a - b) <= float64EqualityThreshold }
Kaedah ini mengekalkan ketepatan terapung dan memberikan hasil yang konsisten, menjadikannya penyelesaian yang teguh untuk membandingkan nilai float64 untuk hampir kesaksamaan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membandingkan Nombor Titik Terapung dengan Cekap untuk Kesamaan Hampir dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!