Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Membandingkan Nombor Titik Terapung dengan Cekap untuk Kesamaan Hampir dalam Go?

Bagaimanakah Saya Boleh Membandingkan Nombor Titik Terapung dengan Cekap untuk Kesamaan Hampir dalam Go?

Linda Hamilton
Linda Hamiltonasal
2024-12-07 14:07:15825semak imbas

How Can I Efficiently Compare Floating-Point Numbers for Near Equality in Go?

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:

  • Kehilangan Ketepatan: Perbandingan bitwise mengabaikan ketepatan terapung, yang membawa kepada potensi ketidaktepatan.
  • Keputusan Tidak Konsisten: Bergantung pada perwakilan binari tertentu, kaedah ini mungkin tidak selalu mengembalikan hasil yang konsisten. Contohnya, dua apungan dengan magnitud yang sama tetapi tanda berbeza mungkin mempunyai perwakilan bitwise yang sama.

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!

Kenyataan:
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