Dernière fois À propos de l'implémentation Verilog-HDL du circuit de calcul Float - Partie 1
26/04 Ajout des résultats de simulation 5/17 Correction d'un bug sur les nombres négatifs
La valeur flottante 32 bits (simple) est-elle la bonne? Créer un outil pour convertir entre la valeur flottante et la valeur de notation hexadécimale
utiliser cgo
Obtenons la représentation interne des nombres à virgule flottante
Code créé cette fois
check.go
package main
/*
union {float f; unsigned i;} uv;
int f2b(float inp) {
uv.f = inp;
return uv.i;
}
float b2f(unsigned inp) {
uv.i = inp;
return uv.f;
}
*/
import "C"
import (
"fmt"
"os"
"strconv"
)
func main() {
if os.Args[1] == "f" {
fmt.Println("float -> hx")
fv, _ := strconv.ParseFloat(os.Args[2], 32)
f2h(float32(fv))
} else if os.Args[1] == "h" {
fmt.Println("hx -> float")
hv, _ := strconv.ParseUint(os.Args[2], 16, 32)
h2f(uint(hv))
}
}
func h2f(inp uint) {
float := float32(C.b2f(_Ctype_uint(inp)))
fmt.Println(float)
}
func f2h(inp float32) {
bits := int(C.f2b(_Ctype_float(inp)))
fmt.Printf("Hex:%08X\n", bits)
fmt.Printf("Exp:%02X\n", bits >> 23 & 0xFF)
fmt.Printf("Fra:%X\n", bits & 0x7FFFFF)
}
Conversion de valeurs dans un corps commun
Je ne fais rien de spécial, donc je pense que cela peut également être implémenté en C. (Plutôt, peut-il être implémenté uniquement avec Go?)
$ go run check.go f 7.25
float -> hx
Hex:40E80000
Exp:81
Fra:680000
La valeur du biais Exp 127 est 7F La valeur de la partie exposant est 81, soit +2.
Aussi, puisque 680000 = 110 1000 0 0 0 0 Vous pouvez voir que 7,25 = 111,01 = 680000 x 2 ^ 2
$ go run check.go h 40E80000
hx -> float
7.25
Vous pouvez voir qu'il peut être retourné correctement
7.25 + 11.625
7.25 + 11.625 = 18.875 \\
-> 40E8\_0000 + 413A\_0000 = 4197\_0000\\
On dirait que c'est vrai
12.345 + 3.1415926
12.345 + 3.1415926 = 15.4865926\\
-> 4145\_851F + 4049\_0FDA = 4177\_C915
On dirait que c'est vrai