Letztes Mal Informationen zur Verilog-HDL-Implementierung der Float-Berechnungsschaltung - Teil 1
4/26 Simulationsergebnisse hinzugefügt 5/17 Fehler mit negativen Zahlen behoben
Ist 32bit float (single) der richtige Wert? Erstellen Sie ein Werkzeug zum Konvertieren zwischen Gleitkommawert und hexadezimalem Notationswert
benutze cgo
Lassen Sie uns die interne Darstellung von Gleitkommazahlen erhalten
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?)
$ 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
7.25 + 11.625
7.25 + 11.625 = 18.875 \\
-> 40E8\_0000 + 413A\_0000 = 4197\_0000\\
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
Es sieht so aus, als ob es richtig ist