Rumah > pembangunan bahagian belakang > Golang > Keputusan Go Float32bit() tidak dijangka

Keputusan Go Float32bit() tidak dijangka

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Lepaskan: 2024-02-06 09:25:11
ke hadapan
1218 orang telah melayarinya

Go Float32bit() 结果不是预期的

Kandungan soalan

Contohnya: 16777219.0 perpuluhan ditukar kepada bit

16777219 -> 1 0000 0000 0000 0000 0000 0011

mantissa: 23 bit
0000 0000 0000 0000 0000 001

exponent:
24+127 = 151
151 -> 10010111

result shoud be:
0_10010111_000 0000 0000 0000 0000 0001

1001011100000000000000000000001
Salin selepas log masuk

Tetapi:

fmt.printf("%b\n", math.float32bits(float32(16777219.0)))

// 1001011100000000000000000000010
Salin selepas log masuk

Kenapa pergi float32bit() keputusan tidak dijangka?

Rujukan:

  • penukaran-asas.ro

Kemas kini:

fmt.Printf("16777216.0:%b\n", math.Float32bits(float32(16777216.0)))
fmt.Printf("16777217.0:%b\n", math.Float32bits(float32(16777217.0)))
//16777216.0:1001011100000000000000000000000
//16777217.0:1001011100000000000000000000000
fmt.Printf("16777218.0:%b\n", math.Float32bits(float32(16777218.0)))
//16777218.0:1001011100000000000000000000001
fmt.Printf("16777219.0:%b\n", math.Float32bits(float32(16777219.0)))
fmt.Printf("16777220.0:%b\n", math.Float32bits(float32(16777220.0)))
fmt.Printf("16777221.0:%b\n", math.Float32bits(float32(16777221.0)))
//16777219.0:1001011100000000000000000000010
//16777220.0:1001011100000000000000000000010
//16777221.0:1001011100000000000000000000010

fmt.Printf("000:%f\n", math.Float32frombits(0b_10010111_00000000000000000000000))
// 000:16777216.000000
fmt.Printf("001:%f\n", math.Float32frombits(0b_10010111_00000000000000000000001))
// 001:16777218.000000
fmt.Printf("010:%f\n", math.Float32frombits(0b_10010111_00000000000000000000010))
// 010:16777220.000000
fmt.Printf("011:%f\n", math.Float32frombits(0b_10010111_00000000000000000000011))
// 011:16777222.000000
Salin selepas log masuk

Apakah peraturannya?


Jawapan betul


go memberikan hasil titik terapung binari ieee-754 yang betul - dibundarkan kepada nilai terdekat, diikat dengan nombor genap.

go Spesifikasi Bahasa Pengaturcaraan

float32     the set of all ieee-754 32-bit floating-point numbers
Salin selepas log masuk

Perpuluhan

16777219
Salin selepas log masuk

adalah binari

1000000000000000000000011
Salin selepas log masuk

Untuk perduaan titik terapung ieee-754 32-bit, mantissa integer 24-bit ialah

100000000000000000000001.1
Salin selepas log masuk

Bundarkan kepada nilai terdekat, nombor genap diberi

100000000000000000000010
Salin selepas log masuk

Padamkan satu bit tersirat daripada mantissa 23-bit untuk mendapatkan

00000000000000000000010
Salin selepas log masuk
package main

import (
    "fmt"
    "math"
)

func main() {
    const n = 16777219
    fmt.printf("%d\n", n)
    fmt.printf("%b\n", n)
    f := float32(n)
    fmt.printf("%g\n", f)
    fmt.printf("%b\n", math.float32bits(f))
}
Salin selepas log masuk

https://www.php.cn/link/f0bbf5fb2b067fda7b491dc2307411e4

16777219
1000000000000000000000011
1.677722e+07
1001011100000000000000000000010
Salin selepas log masuk

Atas ialah kandungan terperinci Keputusan Go Float32bit() tidak dijangka. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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