[GO] Circuit de calcul du flotteur (ry-n ° 1.1 (notation hexadécimale de la valeur flottante)

Obtenez la notation hexadécimale des nombres à virgule flottante (SW)

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

Contenu de cette fois

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

Grand pionnier (références)

Obtenons la représentation interne des nombres à virgule flottante

Code entier

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?)

tester

$ 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

Vérification des résultats de simulation

7.25 + 11.625

7.25 + 11.625 = 18.875 \\
-> 40E8\_0000 + 413A\_0000 = 4197\_0000\\ 

Screenshot from 2020-04-26 20-05-25.png

On dirait que c'est vrai

12.345 + 3.1415926

12.345 + 3.1415926 = 15.4865926\\
-> 4145\_851F + 4049\_0FDA = 4177\_C915

Screenshot from 2020-04-26 20-09-04.png

On dirait que c'est vrai

Recommended Posts

Circuit de calcul du flotteur (ry-n ° 1.1 (notation hexadécimale de la valeur flottante)
Calcul de la valeur de jeu de cisaillement en Python
Convertir un float exponentiel en str en Python