Float 계산 회로의 (ry-그 1.1(float값의 16진수 표기)

부동 소수점수의 16진수 표기를 얻는다(SW)



지난번
Float 계산 회로의 Verilog-HDL 구현에 관하여 - 그 1

4/26 시뮬레이션 결과 추가
5/17 음수 버그 수정

이번 내용



32bit float (single)이 올바른 값입니까?
float 값과 16진수 표기 값을 상호 변환하는 도구 만들기

cgo 사용

위대한 선구자 (참고 문헌)



부동 소수점 숫자의 내부 표현을 얻자.

코드 전체



이번에 만든 코드

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

공용체로 값을 변환합니다.

특별한 일은하지 않으므로 C에서도 구현할 수 있다고 생각합니다.
(오히려 Go만으로 구현할 수 있을까?)

테스트


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

Exp의 바이어스 값 127은 7F이기 때문에
+2 된 81이 지수 부분의 값입니다.

또한 680000 = 110 1000 0 0 0 0이므로
7.25 = 111.01 = 680000 x 2^2임을 알 수 있습니다.
$ go run check.go h 40E80000
hx -> float
7.25

올바르게 되돌릴 수 있음을 알 수 있습니다.

시뮬레이션 결과 검증



7.25+11.625


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



있어요.

12.345+3.1415926


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



있어요.

좋은 웹페이지 즐겨찾기