[GO] Float-Berechnungsschaltung (Ry-Nr. 1.1 (Hexade-Notation des Float-Werts)

Erhalten Sie die hexadezimale Notation von Gleitkommazahlen (SW)

Letztes Mal Informationen zur Verilog-HDL-Implementierung der Float-Berechnungsschaltung - Teil 1

4/26 Simulationsergebnisse hinzugefügt 5/17 Fehler mit negativen Zahlen behoben

Inhalt dieser Zeit

Ist 32bit float (single) der richtige Wert? Erstellen Sie ein Werkzeug zum Konvertieren zwischen Gleitkommawert und hexadezimalem Notationswert

benutze cgo

Großer Pionier (Referenzen)

Lassen Sie uns die interne Darstellung von Gleitkommazahlen erhalten

Ganzer Code

Diesmal wurde Code erstellt

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

Werte in einem kommunalen Körper umwandeln

Ich mache nichts Besonderes, daher denke ich, dass es auch in C implementiert werden kann. (Kann es eher nur mit Go implementiert werden?)

Prüfung

$ go run check.go f 7.25
float -> hx
Hex:40E80000
Exp:81
Fra:680000

Der Exp-Bias-Wert 127 beträgt 7F Der Wert des Exponententeils ist 81, was +2 ist.

Auch da 680000 = 110 1000 0 0 0 0 Sie können sehen, dass 7,25 = 111,01 = 680000 x 2 ^ 2

$ go run check.go h 40E80000
hx -> float
7.25

Sie können sehen, dass es korrekt zurückgegeben werden kann

Überprüfung der Simulationsergebnisse

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

Es sieht so aus, als ob es richtig ist

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

Es sieht so aus, als ob es richtig ist

Recommended Posts

Float-Berechnungsschaltung (Ry-Nr. 1.1 (Hexade-Notation des Float-Werts)
Berechnung des Scherspielwerts in Python
Konvertieren Sie den exponentiellen Float in Python in str