go - 以二进制编码无符号16位浮点数

时间:2015-04-22 06:38:19

标签: go floating-point-conversion

在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。

1 个答案:

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

(代码位于http://play.golang.org/p/G599VOBMcL