【Golang】IEEE754标准二进制字符串转为浮点类型

2024-01-12 17:20

本文主要是介绍【Golang】IEEE754标准二进制字符串转为浮点类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

IEEE754介绍


IEEE 754是一种标准,用于表示和执行浮点数运算的方法。在这个标准中,单精度浮点数使用32位二进制表示,分为三个部分:符号位、指数位和尾数位。

符号位(s)用一个位来表示数的正负,0表示正数,1表示负数。

指数位(e)用8位表示指数。对于单精度浮点数,指数位是以偏移量的形式表示的。也就是说,实际的指数值是指数位的无符号值减去一个偏移量(127)。

尾数位(m)用23位表示数的尾数部分。尾数是一个二进制小数,被规范化为一个小于1的数。

表达式:

V = ( − 1 ) s × ( 1. M ) × 2 ( E − 127 ) V = (-1)^s \times(1.M)\times 2^{(E-127)} V=(1)s×(1.M)×2(E127) (单精度)

V = ( − 1 ) s × ( 1. M ) × 2 ( E − 1023 ) V = (-1)^s \times(1.M)\times 2^{(E-1023)} V=(1)s×(1.M)×2(E1023)(双精度)

在这里插入图片描述

IEEE 754 半精度浮点数16 位符号 1 位,指数 5 位,尾数 10 位
IEEE 754 单精度浮点数32 位符号 1 位,指数 8 位,尾数 23 位
IEEE 754 双精度浮点数64 位 符号 1 位,指数 11 位,尾数 52 位

代码实现计算

 我们首先定义了一个函数binaryIEEE754StringToFloat,它接收一个32位的二进制字符串作为输入,并返回一个浮点数。该函数首先确定输入字符串的长度,并在必要时进行填充,使其达到32位。

 接下来,我们解析符号位、指数位和尾数位。符号位确定数的正负,指数位确定数的范围,尾数位确定数的精度。通过这些步骤,我们能够将二进制字符串转换为浮点数。

 最后,我们在main函数中提供了一个示例二进制字符串,并调用binaryIEEE754StringToFloat函数进行转换。输出结果是一个浮点数,它就是我们所求的结果。

package main
import ("fmt""math""strconv""strings"
)
func binaryIEEE754StringToFloat(binaryStr string) float32 {n := 32 - len(binaryStr)// 补充为32位if n >= 0 && n < 32 {binaryStr = strings.Repeat("0", n) + binaryStr} else {fmt.Println("二进制字符串的长度不合法")return 0}// 解析符号位sign := 1.0if binaryStr[0] == '1' {sign = -1.0}// 解析指数位
(exponent, _ := strconv.ParseInt(binaryStr[1:9], 2, 64))
(exponent -= 127)// 解析尾数位
(mantissa := float32(0))for i := 9; i < len(binaryStr); i++ {if binaryStr[i] == '1' {(mantissa += 1 / float32(math.Pow(2, float64(i-8))))}}// 计算浮点数值
(result := float32(sign) * (1 + mantissa) * float32(math.Pow(2, float64(exponent))))return result
}
func main() {
(binaryStr := "10111111100111101110101110000000") // 示例二进制字符串
(floatVal := binaryIEEE754StringToFloat(binaryStr))fmt.Printf("转换后的浮点数为: %f\n", floatVal)
}

补充(Double类型转换):

func BinaryDoubleStringToFloat(binaryStr string) float64 {// 补充为64位n := 64 - len(binaryStr)if n >= 0 && n < 64 {binaryStr = strings.Repeat("0", n) + binaryStr} else {fmt.Println("二进制字符串的长度不合法")return 0}// 解析符号位sign := 1.0if binaryStr[0] == '1' {sign = -1.0}// 解析指数位exponent, _ := strconv.ParseInt(binaryStr[1:12], 2, 64)exponent -= 1023 // 双精度指数位的偏移量// 解析尾数位mantissa := float64(0)for i := 12; i < len(binaryStr); i++ {if binaryStr[i] == '1' {mantissa += 1 / float64(math.Pow(2, float64(i-11)))}}// 计算浮点数值result := sign * (1 + mantissa) * math.Pow(2, float64(exponent))return result
}

这篇关于【Golang】IEEE754标准二进制字符串转为浮点类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/598609

相关文章

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

Golang 日志处理和正则处理的操作方法

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

golang float和科学计数法转字符串的实现方式

《golangfloat和科学计数法转字符串的实现方式》:本文主要介绍golangfloat和科学计数法转字符串的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望... 目录golang float和科学计数法转字符串需要对float转字符串做处理总结golang float

Python如何判断字符串中是否包含特殊字符并替换

《Python如何判断字符串中是否包含特殊字符并替换》这篇文章主要为大家详细介绍了如何使用Python实现判断字符串中是否包含特殊字符并使用空字符串替换掉,文中的示例代码讲解详细,感兴趣的小伙伴可以了... 目录python判断字符串中是否包含特殊字符方法一:使用正则表达式方法二:手动检查特定字符Pytho

golang实现延迟队列(delay queue)的两种实现

《golang实现延迟队列(delayqueue)的两种实现》本文主要介绍了golang实现延迟队列(delayqueue)的两种实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录1 延迟队列:邮件提醒、订单自动取消2 实现2.1 simplChina编程e简单版:go自带的time

go rate 原生标准限速库的使用

《gorate原生标准限速库的使用》本文主要介绍了Go标准库golang.org/x/time/rate实现限流,采用令牌桶算法控制请求速率,提供Allow/Reserve/Wait方法,具有一定... 目录介绍安装API介绍rate.NewLimiter:创建限流器limiter.Allow():请求是否

Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)

《Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)》本文主要介绍了Golang分布式锁实现,采用Redis+Lua脚本确保原子性,持可重入和自动续期,用于防止超卖及重复下单,具有一定... 目录1 概念应用场景分布式锁必备特性2 思路分析宕机与过期防止误删keyLua保证原子性可重入锁自动

golang 对象池sync.Pool的实现

《golang对象池sync.Pool的实现》:本文主要介绍golang对象池sync.Pool的实现,用于缓存和复用临时对象,以减少内存分配和垃圾回收的压力,下面就来介绍一下,感兴趣的可以了解... 目录sync.Pool的用法原理sync.Pool 的使用示例sync.Pool 的使用场景注意sync.