搜索
您的当前位置:首页正文

基于C++ Builder 6.0的IEEE 754中单精度浮点数转换实现

来源:六九路网
2014年10月15日第37卷第20期

现代电子技术

ModernElectronicsTechniqueOct.2014Vol.37No.2027基于C++Builder6.0的IEEE754中单精度

浮点数转换实现

翟振辉1,欧世峰1,刘继长1,钟全雄2,高颖1

(1.烟台大学光电信息学院,山东烟台摘

264005;2.烟台大学工程实训中心,山东烟台

264005)

要:IEEE754标准规定了可以精确表示某一浮点型数据的单精度(常用)和双精度表示方法,这在许多对数据精度

要求较高的场合得到广泛应用,而在数据通信过程中所有数据都是以十六进制打包和解析、二进制形式传输的,所以研究如何根据该标准把所要传输的浮点型数据编程转换成8位十六进制数据具有重要的实用意义。这里在分析和研究IEEE754标准中浮点型数据单精度表示方式的基础上,结合BorlandC++Builder6.0可视化编程工具,阐述了如何把单精度浮点型数据转换成所需要的8位十六进制数,以及如何把8位十六进制数转换成单精度浮点类型数据,并实现显示。

关键词:IEEE754标准;十六进制数;单精度浮点数;可视化编程工具中图分类号:TN911⁃34

文献标识码:A

文章编号:1004⁃373X(2014)20⁃0027⁃04

Convertoffloating⁃pointdatainIEEE754basedonC++Builder6.0

(1.InstituteofOptoelectronicInformation,YantaiUniversity,Yantai264005,China;2.EngineeringTrainingCenter,YantaiUniversity,Yantai264005,China)

ZHAIZhen⁃hui1,OUShi⁃feng1,LIUJi⁃zhang1,ZHONGQuan⁃xiong2,GAOYing1

Abstract:Thesingleprecisionanddoubleprecisionexpressivemethodswhichcanaccuratelyexpressafloat⁃pointdataarestipulatedinIEEE754standard.Theyarewidelyinthefield,inwhichtheaccuracyrequirementishigh.Onthebaseofstudyingandanalyzingtheexpressionofthe32bitsfloating⁃point,howtotranslatethefloating⁃pointdatatotheneededhexadecimalda⁃mingtoolsBorlandC++Builder6.0,andtheexpressionofthe32bitsfloating⁃pointdataintheIEEE754standard.Thedata

Keywords:IEEE754standard;hexadecimalnumber;floating⁃pointdatawithsingleprecision;visualprogrammingtool

ta,andhowtotranslatethehexadecimaldatatothefloating⁃pointdataareelaboratedincombinationwiththevisualprogram⁃displaywasrealized.

0引言

[1]

应用组件,可以让程序员快速建立各种应用程序[3]。BorlandC++Builder不仅继承了Delphi使用简便、功能强大、效率高等特点,而且它还结合C++语言所有的优开发工具[4]。

目前可视化编程中应用IEEE处理整型数据到浮点型数据运算的研究还很少,本文侧重于实现将8位十六进制的数据转换成浮点型数据,应用于解析Mod⁃上位机可视化软件来显示。

bus中RTU格式[5]通信所获得的浮点型数据,并编写了点。C++Builder可以说是至今最容易上手的Windows

多CPU与浮点运算器所采用。这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormalnum⁃ber)、一些特殊数值(无穷与非数值(NaN))以及这些数值的“浮点数运算子”。它规定了4种表示浮点数值的方式:单精确度(32位元)、双精确度(64位元)、延伸单精确度(43位元以上,很少使用)与延伸双精确度(79位元以上,通常以80位元实做)。其中只有32位元模式有强制要求,其他都是选择性的[2]。

序开发工具之一,它易学易用的操作界面和功能强大的

BorlandC++Builder是最知名的可视化C++应用程

IEEE754是最广泛使用的浮点数运算标准,为许

1

1.1

转换算法介绍

浮点型数据保存的格式[1]如表1所示。其中:S表示浮点数保存格式

收稿日期:2014⁃05⁃15

基金项目:国家自然科学基金(61201457)

符号位;“1”表示负数;“0”表示正数;E代表偏移127的幂数,二进制阶码=(EEEEEEEE)-127;M代表24位的

Copyright©博看网 www.bookan.com.cn. All Rights Reserved.28现代电子技术

1.2.3

E部分全部为1

2014年第37卷尾数,存放在23个位中,只存储23位,最高位固定为1,此方法用最少的位数实现了较高的有效位数,提高了精度“0”是一个特定值,幂数是0,尾数也是0。

表1

地址内容

+0

浮点型数据保存的格式+1

+2

+3

大类情况:

如果E部分全为1,则系数k=28-1=127,此时又分两

(1)尾数是0的情况,这类情况下的数要么是正无穷大要么是负无穷大;

(2)尾数不全为0的情况,根据IEEE754标准,这类情况是表示的一个没有被定义的数,也就是不存在这样的数。

结合以上三部分的分析可得出计算步骤如下:(1)先判断十六进制数的最高位是否为1:若为1则是负数,若为0则是正数;

(2)把该数右移23位并和0xFF相与,得到二进制数(EEEEEEEE);

(3)把步骤(2)得到的二进制数(EEEEEEEE)减127得到二进制的最高位幂数(设为k);

(4)把原数和0x7FFFFF相与得到不带最高位的尾

SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM1.2

式,要把十六进制转换为一个浮点数,必须按照表1中所示的方式进行分开。这里又分为三种情况:

(1)E部分不全为0也不全为1的情况;(2)E部分全部为0的情况;(3)E部分全部为1的情况。1.2.1

E部分不全为0也不全为1

IEEE754标准中的浮点保存值不是一个直接的格

十六进制数转换为浮点型数据

以0xC1420000为例,先把0xC1420000写成表1中SEEEEEEEEMMMMMMMMMMMMMMMMM⁃11000001010000100000000000000000

所示形式,如下:MMMMMM

数(MMMMMMMMMMMMMMMMMMMMMMM),然后再把得到的尾数的最高数置“1”,即得到完整的尾数:(1MMMMMMMMMMMMMMMMMMMMMMM);

(5)在步骤(4)中得到的尾数的24位二进制数乘以2k并相加即是所求浮点数

由上可以看出,此数是一个负数,二进制阶码=(10000010)-127=3,也就是实际的幂数。尾数是后面的二进制数10000100000000000000000,这是已存储的23位二进制,还有一位没有被存储的最高位,固定为1,所以整个尾数即:110000100000000000000000则根据实际的幂数,浮点型数为:

23

2编程实现

打开BorlandC++Builder6.0,在空白的Form1上放

置5个Edit控件,2个Label控件,1个按钮,布局Form上的控件并修改属性[3],如图1所示。

1.2.2

这是一种非规格化的数据,此时k=1-

E部分全为0

öæ

2k×ç∑M×2i-23÷=-12.25

øèi=0

(1)

=-126,完整的位数部分为0MMMMMMMMM⁃(27-1)

MMMMMMMMMMMMMM。以0x800BCAEF为例,先把0x800BCAEF写成表1中所示形式,如下:

图1

软件设计界面

MMMMMM

SEEEEEEEEMMMMMMMMMMMMMMMMM⁃10000000000010111100101011101111

软件工作流程如图2所示。

3仿真结果

把前面举例的数据0xC1420000进行计算,计算结

由上可以看出,此数是一个负数,二进制阶码k=1-127=-126,也就是实际的幂数。

尾数是后面的二进制数0001011110010101110

果如图3所示。可由图3看出计算结果和第1.2.1中计算结果一致。

其次再把第1.2.2部分中所举的数据用软件进行计算,结果如图3所示。

可由图4看出,计算结果与第1.2.2部分中分析得出

(2)

的结果一致。最后把第1.2.3部分中描述的情况用软件实现,结果如图5所示。

的最高位,固定为1,所以整个尾数即:100010111100101011101111,则根据实际的幂数,浮点型数为:

öæ

2k×ç∑M×2i-23÷=-1.08298931425e-39

øèi=0

23

1111,这是已存储的23位二进制,还有一位没有被存储

Copyright©博看网 www.bookan.com.cn. All Rights Reserved.第20期

翟振辉,等:基于C++Builder6.0的IEEE754中单精度浮点数转换实现

29图2软件工作流程图

图5显示的是E部分全部为1且尾数部分不全为0的情况的计算结果。

图6上半部分显示的是E部分全部为“1”且尾数部分全为“0”的一种计算。由于最高位为“1”,所以计算结果是负无穷大;下半部分是另外一种计算,由于最高位是“0”,所以计算结果是正无穷大。

图3E部分不全为0也不全为1数据计算结果

图6E部分全为1且尾数部分全为0的计算

另外本文又仿真了一组Modbus协议中表示温度的十六进制数据,转换成浮点型数据,仿真结果如图7所示。

图4E部分全为0数据计算结果

图7温度数据仿真结果

4

图5

E部分全为1且尾数部分不全为0的数据计算

仿真结果验证

为了验证仿真结果的正确性,本文编写了从浮点型

Copyright©博看网 www.bookan.com.cn. All Rights Reserved.30行一一验证,验证结果如图8、图9所示。

现代电子技术

2014年第37卷数据转换成十六进制数据的计算软件,将之前的数据进

图9温度数据仿真结果验证

为确保本文中计算软件的无误计算,本文在-1000~

图8

数据仿真结果验证

表2

序号12345678910

原始数据-982.917214191853-633.377135348226-762.15505913272

十六进制数0xC475BAB40xC43E89EC0xC41E58230xC3B557210xC2283322

1000之间随机取数进行了大量的数据转换计算实验,并随机记录了10组数据,如表2所示。

标准试验系统结果数据转换结果-982.917236328125-762.155029296875-633.377136230469-42.049934387207357.424438476562452.036804199219743.758239746094969.776611328125误差(科学计数法)2.21362721504192e-5-2.98358451118474e-58.82242716215842e-71.12686457214295e-5

小数点后2位-982.92-762.16-633.38-362.68-42.05357.42452.04743.76969.7823.65

小数点后4位-982.9172-762.1551-633.3771-362.6807-42.049923.6531

-42.049934296977823.6530880420498357.42444152431452.03679369251

-362.680683311432-362.68069458007823.6530876159668

0x41BD39860x43B2B6540x4439F0870x43E204B60x447271B49.02292782711811e-83.0477475547741e-6

4.26083047955217e-7

743.758212877792969.776609724047-1.05067089180011e-5

357.4244452.0368743.7582969.7766-2.68683013473492e-5

-1.60407762450632e-6由表2中数据仿真结果及其验证可以看出本文中所编写的转换算法的精度是非常高的,能够满足高精度测量仪器的数据转换使用,而且可以看出小数点后保留的位数越多得出的结果越接近原始的数据。

arithmetic[S].USA:MicroprocessorStandardsCommitteeof[2]程展鹏.BorlandC++Builder6应用开发技术解析[M].北京:清

华大学出版社,2003.

[3]谭浩强.C语言程序设计[M].4版.北京:清华大学出版社,2010.

版社,2003.

theIEEEComputerSociety,1985.

ciety.IEEEStd754⁃1985IEEEstandardforfloating⁃point

5结论

利用BorlandC++Builder6.0编程开发环境完成的十六进制整型数据转换为浮点型数据的软件实现了从整型数据到浮点型数据的转换计算,经过二次开发该软件可被用于Modbus通信协议中高精度浮点型数据的传输打包、解析和显示。另外,本文也完成了从浮点型数据到十六进制整型数据的转换编程及仿真显示。

[4]吴逸贤,吴目成.精彩C++Builder6程序设计[M].北京:科学出[5]全国工业过程测量和控制标准化技术委员会.GB/T19582⁃[6]陈鹏,蔡雪梅.NIOS浮点运算定制指令的实现[J].现代电子技

术,2011,34(10):166⁃168.

[7]唐小明,张涛,王贞杰,等.一种新的基于FPGA的数据格式转

换方法[J].现代电子技术,2011,34(16):110⁃112.

[8]谢跃雷,陈敏.粒子滤波算法中浮点指数函数的FPGA设计实

现[J].现代电子技术,2008,31(18):119⁃121.

2008Modbus通信协议[S].北京:中国标准出版社,2008.

[1]MicroprocessorStandardsCommitteeoftheIEEEComputerSo⁃

作者简介:翟振辉(1985—),男,硕士研究生。研究方向为语音增强、计算机应用。

欧世峰(1979—),男,副教授。研究方向为语音信号处理。

Copyright©博看网 www.bookan.com.cn. All Rights Reserved.

因篇幅问题不能全部显示,请点此查看更多更全内容

Top