多个字节如何转为浮点数
haoteby 2025-01-03 16:08 1 浏览
前言:
在自动化领域,大多数PLC、软件工程师都清楚多个字节如何转为整形,比如转为16/32位有无符号数。但是字节如何转浮点很多工程师就不清楚了。
为什么使用标准
今天我们手动用算法转换一下,在转换之前大家想想,为什么不论工控机、西门子、三菱或是其他品牌PLC,都能正常显示浮点数?其实他们的底层一定离不开数据标准。没错,我们使用IEEE754标准算法进行计算。
标准重点
IEEE 754标准是一种广泛使用的浮点数运算标准,它定义了浮点数的表示格式、运算规则以及特殊值的处理方式。以下是关于IEEE 754标准中浮点数表示的关键信息:
- 浮点数主要由三部分组成:符号位(S)、阶码(E)和尾数(M)。
- 符号位用于表示数的正负,0表示正数,1表示负数。
- 阶码用于表示浮点数的指数部分,采用移码表示,并有一个固定的偏移值。
- 尾数用于表示浮点数的有效数字部分,采用原码表示,且小数点前隐含一个1。
- 根据IEEE 754标准,任意一个二进制浮点数V可以表示为:V = (-1)S * (1+M) * 2(E-偏置值)。
- 其中,M为尾数部分,E为阶码位,S为符号位。
- 尾数M的数值位相当于多表示了1位(因为小数点前隐含一个1),且节省了存储空间。
代码实践
可以看到成功的将Π的字节数组转为单精度和双精度的浮点数
代码分享
static void Main(string[] args)
{
/*
* 标准IEEE 754
* 单精度浮点32位 符号位1位+指数位(阶码)8位+尾数码23位 偏置值127
* 双精度浮点64位 符号位1位+指数位(阶码)11位+尾数码52位 偏置值1023
*/
BytesToSingle();
BytesToDouble();
}
static void BytesToSingle()
{
/*
* 标准IEEE 754
* 单精度浮点32位 符号位1位+指数位(阶码)8位+尾数码23位 偏置值127
*/
//获取32位浮点字节数组,也可以通信来自PLC、单片机、仪表等,这里用Π3.1415926对应的字节数组模拟
byte[] bytes = BitConverter.GetBytes((float)Math.PI);
//这里先用微软提供的库进行可逆转换验证。
float fValue = BitConverter.ToSingle(bytes,0);
/*
* 以下是根据IEEE754标准进行手动计算
*/
//将字节数组转为32位整数
uint bits = BitConverter.ToUInt32(bytes, 0);
// 提取符号位
uint sign = (bits >> 31);
// 提取指数位 并减去偏置127
uint exponent = ((bits >> 23) & 0xFF)-127;
// 提取尾数位
uint mantissa = bits & 0x7FFFFF;//23位7+5个F
// 加上隐含的 1
double mantissaValue = 1 + (mantissa / (float)(1 << 23));
//根据IEE 754单精度浮点数计算公式(-1)S方 * M *2e方
//-1的0次方1 ,-1的1次方-1
float result = (float)(Math.Pow(-1, sign) * mantissaValue * Math.Pow(2, exponent));
Console.WriteLine(#34;Π的单精度手动计算值是:{result}");
Console.ReadLine();
}
static void BytesToDouble()
{
/*
* 标准IEEE 754
* 双精度浮点64位 符号位1位 + 指数位(阶码)11位 + 尾数码52位 偏置值1023
*/
//获取64位浮点字节数组,也可以通信来自PLC、单片机、仪表等,这里用Π3.1415926对应的字节数组模拟
byte[] bytes = BitConverter.GetBytes(Math.PI);
//这里先用微软提供的库进行可逆转换验证。
double dValue = BitConverter.ToDouble(bytes,0);
//以下是手动转换库
//将字节数组转为32位整数
ulong bits = BitConverter.ToUInt64(bytes, 0);
// 提取符号位
int sign =(int) (bits >> 63);
// 提取指数位 并减去偏置1024
ulong exponent = ((bits >> 52) & 0x7FF) - 1023;
// 提取尾数位
ulong mantissa = bits & 0xFFFFFFFFFFFFF;//52/4=13个F
// 加上隐含的 1
//double mantissaValue = 1+ mantissa / Math.Pow(2,52);//指数写法
double mantissaValue = 1 + mantissa / (double)(1ul<<52);//左移写法 注意普通左移1是32位的,会溢出,故写为1ul
//根据IEE 754双精度浮点数计算公式(-1)s方 * M * 2e方
//-1的0次方1 ,-1的1次方-1
double result = Math.Pow(-1, sign) * mantissaValue * Math.Pow(2, exponent);
Console.WriteLine(#34;Π的双精度手动计算值是:{result}");
Console.ReadLine();
}
注意
在转换前,应注意大小端是否转换问题。
结语
虽然微软已经有库供我们使用,但是知道其转换原理,在任何可编程的控制器都可以轻松实现。欢迎关注、点赞、转发、栋哥自动化,专注电气、软件、视觉等控制系统。
相关推荐
- 用户界面干货盘点
-
为了解决大家找资源难的问题,EVGET特别开辟每周盘点用户界面干货的专栏,一网打尽热门的界面资讯、Demo示例、版本升级及下载、移动Web开发,以及各种UI神器推荐。更多资源及工具也可以在用户界面专题...
- 不仅仅是创意,26款科技小玩意
-
新科技不断在卖场出现,总是吸引着消费者的眼球。许多很棒的科技小玩意儿被发明,手机、平板、手提电脑、游戏主机、甚至是3D打印都适用。现在的初创公司已经发正在让21世纪打破各种科技壁垒障碍。本文收集26...
- FastReport.Net报表设计器如何连接到SQLCe
-
MicrosoftSQLServerCompactEdition是一个简单的本地关系数据库,不需要安装,并且已与数据库文件建立连接。您不需要管理员权限即可使用基础功能。您也只能“密码”基础功能...
- 2015年最值得关注的8款用户界面新品
-
软件界面开发解决方案这一块一直以来是慧都控件(EVGET)的强项,我们有400多款用户界面产品,250多款图表报表产品,此外还提供专业的软件界面定制开发服务,其中DevExpress定制开发、甘特图定...
- 小贴士:安装TBarCode office的注意事项和相关资源
-
TBarCodeoffice是一款适用于MicrosoftWord2007、2010等版本,具有强大功能的条码插件。在这里我们介绍一下安装TBarCodeoffice的注意事项和相关资源。安装...
- 初学者不容错过的修复Bug小技巧
-
Bug的发生,我想这是每个开发人员几乎每天都要面对的问题,包括历史上非常有名的编程人员,他们依旧要面对Bug。成为一个熟练的程序员并不意味着永远不会犯错误,而是擅于发现错误并能很好地修正错误。当你刚开...
- 【推荐】一款基于 .NET 开源的支持多厂区、多项目级的MOM/MES系统
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍tmom是一款基于.NET开源、通用的生产制造系统,支持多厂区/多项目级的MOM/MES系统,计划排程...
- 你不可不知的10个Github功能
-
Github让全世界的开发人员、设计人员可以在一起工作交流。Github不仅提供大量开源项目、编程语言代码,他也发布过Windows和OSX桌面应用,可以让我们在工作中无缝集成Github。...
- Fastreport.Net用户手册(十四):文本编辑
-
编辑对象的文本,只需双击文本内容,然后会弹出一个文本编辑器。在编辑器右方有一个可以添加至文本中的数据树组件。可以通过鼠标拖拽该组件到需要的地方。在文本中嵌入该组件的另一个方法是双击该组件,然后该组件将...
- 火狐浏览器开发者专版上手体验
-
当Mozilla宣布FirefoxDeveloperEdition,我想不少开发者都很高兴,因为第一个大型开发者专用浏览器诞生了。既然是开发者专用版,那么和普通版本肯定是不一样的。早已经迫不及待...
- FastReport.Net 2015.3.3 优化了报表解析器
-
FastReport.Net2015.3.3于近日正式发布。点击FastReport.Net2015.3.3下载试用FastReport.Net最新版本。[Core][Exports]重写保存在...
- 改变上网体验:10个超赞的Google Chrome扩展
-
你使用谷歌浏览器浏览网页吗?其实,全世界数以百万的用户都喜欢使用GoogleChrome浏览网页,这也促使其成为全球使用量第二大的Web浏览器。GoogleChrome浏览器具有快速、干净的页面,...
- 如何在 FastReport Online Designer 中处理报表的 5 个函数
-
FastReports产品的时代并没有停滞不前。每个月都会添加新的函数和对象,并改进和优化当前的代码。FastReportOnlineDesigner...
- Winform应用界面开发技术特点图解
-
整理一下自己之前的Winform开发要点,以图文的方式展示一些关键性的技术特点,总结一下。...
- 跨平台的可视化Web报表设计器-FastReport Online Designer
-
好消息!FastReportOnlineDesigner现在作为一个独立的应用程序发布啦!此前作为FastReport.Net的专业版的一部分的在线设计测试版,现在可以单独或作为FastRepor...