登录
首页 >  Golang >  Go问答

uint16 到 xx.x float——最快的算法?

来源:stackoverflow

时间:2024-04-11 22:54:31 125浏览 收藏

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《uint16 到 xx.x float——最快的算法?》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!

问题内容

我从温度传感器接收数据,该数据格式为两个字节,它们是固定宽度浮点数据的二进制编码。编码方案如下表所示:

| temperature | hexadecimal | int16 |
| 0.1 *f      | 0x00 0x01   | 01    |
| 10.0 *f     | 0x00 0x64   | 100   |

为了重建浮点值,我编写了以下简短程序:

package main

import (
    "encoding/binary"
    "fmt"
    "strconv"
)

func main() {
    b1 := byte(0x02)
    b2 := byte(0xBC)
    b := []byte{b1, b2}
    intgr := binary.BigEndian.Uint16(b)
    str := fmt.Sprint(intgr)
    l := len(str)
    front := str[:l-1]
    decimal := str[l-1:]
    str = fmt.Sprintf("%v.%v", front, decimal)
    float, _ := strconv.ParseFloat(str, 64)
    fmt.Println(float)
}

但是对于我的需求来说它有点太慢了,我认为这是因为我使用了 sprint/sprintf。是否有更快(也许更干净)的算法来执行此操作?


解决方案


将字节转换为数字并除以 10:

b := []byte{0x02, 0xbc}
f := float64(binary.bigendian.uint16(b)) / 10.0

逆向转换为:

p := make([]byte, 2)
binary.bigendian.putuint16(p, uint16(math.round(f*10.0)))

要处理负数,请在转换为 float 之前将 uint16 转换为 int16:

f := float64(int16(binary.BigEndian.Uint16(p))) / 10.0

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《uint16 到 xx.x float——最快的算法?》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>