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
Lepaskan: 2024-12-07 14:07:15
asal
788 orang telah melayarinya

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
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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!

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