Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Menganalisis ketidaktepatan titik terapung Golang

Menganalisis ketidaktepatan titik terapung Golang

PHPz
PHPzasal
2023-04-06 08:54:47823semak imbas

Golang ialah bahasa pengaturcaraan yang sangat popular. Kesederhanaan, kecekapan, keselamatan dan ciri-ciri lain meletakkan asas untuk aplikasinya dalam pengkomputeran awan, kontena, rantaian blok dan bidang lain. Walaupun Golang mempunyai sejarah sepuluh tahun, terdapat beberapa masalah dengan pemprosesan nombor titik terapung Artikel ini akan menganalisis ketidaktepatan nombor titik terapung Golang.

Pertama, kita perlu tahu bagaimana nombor titik terapung disimpan. Golang menggunakan nombor titik terapung berketepatan dua kali ganda 64-bit (iaitu float64) di peringkat bawah untuk menyimpan nombor titik terapung, di mana sebahagian daripada digit perduaan mewakili digit perpuluhan, dan sebahagian daripada digit perduaan mewakili digit integer. Disebabkan ketepatan terhad storan binari dalaman komputer bagi nombor titik terapung, hanya nombor binari terhad boleh digunakan untuk lebih kurang mewakili nombor nyata tidak rasional, jadi terdapat ralat pembundaran.

Sebagai contoh, jika kita mewakili 0.1 dalam bentuk binari, kita boleh mendapatkan 0.0001 1001 1001 1001..., tetapi disebabkan ralat pembundaran, apa yang sebenarnya disimpan di dalam komputer ialah 0.0001 1001 1001 1001 101 101 1001 1001 ..., Ini membawa kepada beberapa keputusan yang pelik apabila Golang mengendalikan 0.1.

Berikut ialah kod Golang yang menggunakan gelung for untuk mengeluarkan 10 tempat perpuluhan pertama 0.1:

package main

import "fmt"

func main() {
    var n float64 = 0.1
    for i := 0; i < 10; i++ {
        fmt.Println(n)
        n += 0.1
    }
}

Output yang kami jangkakan ialah:

0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1

Namun Sebenarnya, hasil keluaran ialah:

0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999

Jelas sekali, Golang tidak dapat mengendalikan 0.1 dengan tepat, tetapi hasil seperti 0.30000000000000004 dan 0.7999999999999999 muncul. Ini kerana di dalam komputer, 0.1 lebih kurang diwakili sebagai gelung nombor binari tak terhingga. Setiap kali operasi tambah dilakukan, ralat pembundaran akan dikuatkan, akhirnya membawa kepada ralat asimptotik.

Selain operasi tambah, operasi titik terapung Golang yang lain, seperti penolakan, pendaraban, pembahagian, dll., juga mempunyai isu ketepatan. Selain itu, limpahan atau aliran bawah juga mungkin berlaku apabila berurusan dengan nombor titik terapung yang sangat besar atau sangat kecil.

Untuk mengelakkan masalah ini, anda boleh menggunakan pakej matematik/besar yang disediakan oleh Golang untuk mengendalikan nombor besar dan nombor titik terapung berketepatan tinggi. Di samping itu, untuk beberapa senario aplikasi yang memerlukan keperluan yang sangat tepat, anda boleh mempertimbangkan untuk menggunakan bahasa pengaturcaraan seperti C++ atau Python untuk melaksanakannya.

Ringkasnya, Golang akan mempunyai beberapa ketidaktepatan semasa memproses nombor titik terapung, yang disebabkan oleh ralat pembundaran dalam komputer. Untuk mengelakkan masalah ini, adalah perlu untuk memilih bahasa pembangunan dan perpustakaan yang sesuai mengikut senario aplikasi tertentu untuk memastikan ketepatan hasil pengiraan.

Atas ialah kandungan terperinci Menganalisis ketidaktepatan titik terapung Golang. 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