在Go中,如何将浮点数编码为字节数组,作为16位无符号浮点数,具有11个明确的尾数位和5位显式指数?
似乎并不是一种干净的方式。我唯一能想到的是将其编码为Convert byte array "[]uint8" to float64 in GoLang并手动截断位。
是否有"去"这样做的方法?
这里有确切的定义:
16位无符号浮点数,具有11个明确的尾数位和5位显式指数
在IEEE 754之后,比特格式被宽松地建模。例如,1微秒表示为0x1,其指数为零,以5个高阶位表示,尾数为1,以11个低阶位表示。当显式指数大于零时,在尾数中假定隐含的高阶12位为1。例如,浮点值0x800的显式指数为1,显式尾数为0,但其有效尾数为4096(假设第12位为1)。此外,实际指数比显式指数小1,值表示4096微秒。任何大于可表示范围的值都会被钳制为0xFFFF。
答案 0 :(得分:2)
我不确定我是否正确理解编码(请参阅我对原始问题的评论),但这是一个可以做你想要的功能:
func EncodeFloat(seconds float64) uint16 {
us := math.Floor(1e6*seconds + 0.5)
if us < 0 {
panic("cannot encode negative value")
} else if us > (1<<30)*4095+0.5 {
return 0xffff
}
usInt := uint64(us)
expBits := uint16(0)
if usInt >= 2048 {
exp := uint16(1)
for usInt >= 4096 {
exp++
usInt >>= 1
}
usInt -= 2048
expBits = exp << 11
}
return expBits | uint16(usInt)
}