【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

相关文章

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

C 标准库 - `<float.h>`

C 标准库 - <float.h> 概述 <float.h> 是 C 标准库中的一个头文件,它定义了与浮点数类型相关的宏。这些宏提供了关于浮点数的属性信息,如精度、最小和最大值、以及舍入误差等。这个头文件对于需要精确控制浮点数行为的程序非常有用,尤其是在数值计算和科学计算领域。 主要宏 <float.h> 中定义了许多宏,下面列举了一些主要的宏: FLT_RADIX:定义了浮点数的基数。

Mysql BLOB类型介绍

BLOB类型的字段用于存储二进制数据 在MySQL中,BLOB类型,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储的大小不同。 TinyBlob 最大 255 Blob 最大 65K MediumBlob 最大 16M LongBlob 最大 4G

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数