Float 계산 회로의 (ry-그 1.1(float값의 16진수 표기)
부동 소수점수의 16진수 표기를 얻는다(SW)
지난번
Float 계산 회로의 Verilog-HDL 구현에 관하여 - 그 1
4/26 시뮬레이션 결과 추가
5/17 음수 버그 수정
이번 내용
32bit float (single)이 올바른 값입니까?
float 값과 16진수 표기 값을 상호 변환하는 도구 만들기
cgo 사용
위대한 선구자 (참고 문헌)
부동 소수점 숫자의 내부 표현을 얻자.
코드 전체
이번에 만든 코드
check.gopackage 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
있어요.
Reference
이 문제에 관하여(Float 계산 회로의 (ry-그 1.1(float값의 16진수 표기)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Soleiyu/items/1fbdc78c68ad69a6d34d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
있어요.
Reference
이 문제에 관하여(Float 계산 회로의 (ry-그 1.1(float값의 16진수 표기)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Soleiyu/items/1fbdc78c68ad69a6d34d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
7.25 + 11.625 = 18.875 \\
-> 40E8\_0000 + 413A\_0000 = 4197\_0000\\
12.345 + 3.1415926 = 15.4865926\\
-> 4145\_851F + 4049\_0FDA = 4177\_C915
Reference
이 문제에 관하여(Float 계산 회로의 (ry-그 1.1(float값의 16진수 표기)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Soleiyu/items/1fbdc78c68ad69a6d34d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)