【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

相关文章

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎

C#之枚举类型与随机数详解

《C#之枚举类型与随机数详解》文章讲解了枚举类型的定义与使用方法,包括在main外部声明枚举,用于表示游戏状态和周几状态,枚举值默认从0开始递增,也可手动设置初始值以生成随机数... 目录枚举类型1.定义枚举类型(main外)2.使用生成随机数总结枚举类型1.定义枚举类型(main外)enum 类型名字

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1