Pembolehubah lwn. Pendaraban Titik Terapung dalam Go: Teka-teki Ketepatan
Dalam Go, membandingkan literal titik terapung dengan rakan pembolehubah mereka mungkin membuahkan hasil yang mengejutkan. Pertimbangkan kod berikut:
x := 10.1 fmt.Println("x*3.0 == 10.1*3.0:", x*3.0 == 10.1*3.0)
Walaupun operasi pendaraban adalah sama, hasilnya adalah palsu. Mengapakah terdapat percanggahan?
Pemalar dan Ketepatan
Pemalar titik terapung dan literal dalam Go memiliki kejituan tanpa had. Walau bagaimanapun, apabila ditugaskan kepada pembolehubah yang ditaip, nilai mesti mematuhi kekangan jenis. Dalam kes ini, x ditugaskan kepada float64, yang mempunyai kejituan terhad.
Memelihara Ketepatan
Apabila menyatakan literal terapung secara eksplisit, seperti dalam 10.1*3.0, ketepatan penuh dikekalkan sebelum operasi dilakukan. Sebaliknya, apabila memberikan literal terapung kepada pembolehubah, ketepatan hilang semasa penukaran kepada jenis sasaran.
Implikasi
Tingkah laku ini adalah mengikut reka bentuk dan mempunyai implikasi untuk perbandingan titik terapung. Apabila membandingkan pembolehubah yang ditaip dengan setara literalnya, perbezaan ketepatan boleh menyebabkan hasil yang tidak dijangka. Seperti yang didokumenkan dalam catatan blog Go tentang pemalar, pemalar berangka wujud dalam ruang berangka tanpa batasan, tetapi menghadapi had apabila diberikan kepada jenis tertentu.
Contoh
Pertimbangkan perkara berikut pemalar diisytiharkan dalam Go:
const Huge = 1e1000
Walaupun pemalar ini boleh digunakan dalam ungkapan, ia tidak boleh ditugaskan kepada pembolehubah float64 kerana ketepatannya yang berlebihan. Oleh itu, pernyataan fmt.Println(Huge) akan gagal untuk disusun.
Kesimpulan
Percanggahan dalam pendaraban titik terapung antara literal dan pembolehubah berpunca daripada kehilangan ketepatan semasa tugasan kepada pembolehubah ditaip. Memahami tingkah laku ini adalah penting untuk mengelakkan hasil yang tidak dijangka dan memastikan perbandingan yang tepat dalam operasi titik terapung Go.
Atas ialah kandungan terperinci Mengapa Pendaraban Titik Terapung Menghasilkan Keputusan Berbeza dengan Pembolehubah dan Huruf dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!