Maison > développement back-end > Golang > Le résultat Go Float32bit() n'est pas attendu

Le résultat Go Float32bit() n'est pas attendu

WBOY
Libérer: 2024-02-06 09:25:11
avant
1173 Les gens l'ont consulté

Go Float32bit() 结果不是预期的

Contenu de la question

Par exemple : 16777219.0 décimal converti en bits

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
Copier après la connexion

Mais :

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

// 1001011100000000000000000000010
Copier après la connexion

Pourquoi le résultat float32bit() n'est-il pas attendu ?

Référence :

  • base-conversion.ro

Mise à jour :

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
Copier après la connexion

Quelles sont les règles ?


Réponse correcte


go donne le résultat binaire à virgule flottante ieee-754 correct - arrondi à la valeur la plus proche, lié aux nombres pairs.

Spécification du langage de programmation go

float32     the set of all ieee-754 32-bit floating-point numbers
Copier après la connexion

Décimal

16777219
Copier après la connexion

est binaire

1000000000000000000000011
Copier après la connexion

Pour le binaire à virgule flottante ieee-754 32 bits, la mantisse entière 24 bits est

100000000000000000000001.1
Copier après la connexion

Arrondissez à la valeur la plus proche, les nombres pairs sont donnés

100000000000000000000010
Copier après la connexion

Supprimez le bit implicite de la mantisse de 23 bits pour obtenir

00000000000000000000010
Copier après la connexion
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))
}
Copier après la connexion

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

16777219
1000000000000000000000011
1.677722e+07
1001011100000000000000000000010
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal