Rumah > pembangunan bahagian belakang > Golang > Ketepatan Titik Terapung Go: Mengapakah `float32` Menyebabkan Gelung Tak Terhingga Manakala `float64` Tidak?

Ketepatan Titik Terapung Go: Mengapakah `float32` Menyebabkan Gelung Tak Terhingga Manakala `float64` Tidak?

DDD
Lepaskan: 2024-12-24 14:56:11
asal
459 orang telah melayarinya

Go's Floating-Point Precision: Why Does `float32` Cause Infinite Loops While `float64` Doesn't?

Ketepatan Titik Terapung dalam Go: float32 vs float64

Dalam Go, nombor titik terapung diwakili menggunakan format binari IEEE 754. Format ini menyediakan tahap ketepatan yang berbeza-beza bergantung pada jenis data yang digunakan, dengan float32 menawarkan kurang ketepatan berbanding float64.

Pertimbangkan coretan kod berikut, yang menunjukkan浮点数误差:

package main

import "fmt"

func main() {
    a := float64(0.2)
    a += 0.1
    a -= 0.3
    var i int
    for i = 0; a < 1.0; i++ {
        a += a
    }
    fmt.Printf("After %d iterations, a = %e\n", i, a)
}
Salin selepas log masuk

Apabila menggunakan float64, atur cara dengan betul output:

After 54 iterations, a = 1.000000e+00
Salin selepas log masuk

Walau bagaimanapun, jika float32 digunakan sebaliknya, atur cara memasuki gelung tak terhingga. Ini kerana float32 tidak boleh mewakili nilai perpuluhan 0.1 dengan tepat, menghasilkan nilai yang sedikit bulat. Nilai bulat ini menghalang gelung daripada ditamatkan.

Untuk memahami perbezaan ini, periksa perwakilan binari bagi nilai titik terapung yang terlibat:

float32(0.1): 00111101110011001100110011001101
float32(0.2): 00111110010011001100110011001101
float32(0.3): 00111110100110011001100110011010
float64(0.1): 0011111110111001100110011001100110011001100110011001100110011010
float64(0.2): 0011111111001001100110011001100110011001100110011001100110011010
float64(0.3): 0011111111010011001100110011001100110011001100110011001100110011
Salin selepas log masuk

Perhatikan bahawa perwakilan binari 0.1 dalam float32 berbeza sedikit daripada float64. Perbezaan sedikit ini membawa kepada tafsiran nilai yang berbeza mengikut jenis float32, menghasilkan tingkah laku yang diperhatikan.

Ringkasnya, apabila menggunakan float32, nilai anggaran 0.1 disimpan dalam ingatan, yang mempengaruhi ketepatan dan ketepatan operasi titik terapung. Sebaliknya, float64 boleh mewakili nilai perpuluhan 0.1 dengan lebih tepat, membolehkan pengiraan yang lebih tepat.

Atas ialah kandungan terperinci Ketepatan Titik Terapung Go: Mengapakah `float32` Menyebabkan Gelung Tak Terhingga Manakala `float64` Tidak?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan