Rumah >pembangunan bahagian belakang >Golang >Mengapa Pendaraban Titik Terapung Menghasilkan Keputusan Berbeza dengan Pembolehubah dan Huruf dalam Go?

Mengapa Pendaraban Titik Terapung Menghasilkan Keputusan Berbeza dengan Pembolehubah dan Huruf dalam Go?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-04 12:23:06202semak imbas

Why Does Floating-Point Multiplication Produce Different Results with Variables and Literals in Go?

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!

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