999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于C++ Builder 6.0的IEEE 754中單精度浮點(diǎn)數(shù)轉(zhuǎn)換實(shí)現(xiàn)

2014-10-14 17:37:10翟振輝
現(xiàn)代電子技術(shù) 2014年20期

翟振輝

摘 要: IEEE 754標(biāo)準(zhǔn)規(guī)定了可以精確表示某一浮點(diǎn)型數(shù)據(jù)的單精度(常用)和雙精度表示方法,這在許多對(duì)數(shù)據(jù)精度要求較高的場(chǎng)合得到廣泛應(yīng)用,而在數(shù)據(jù)通信過(guò)程中所有數(shù)據(jù)都是以十六進(jìn)制打包和解析、二進(jìn)制形式傳輸?shù)模匝芯咳绾胃鶕?jù)該標(biāo)準(zhǔn)把所要傳輸?shù)母↑c(diǎn)型數(shù)據(jù)編程轉(zhuǎn)換成8位十六進(jìn)制數(shù)據(jù)具有重要的實(shí)用意義。這里在分析和研究IEEE 754標(biāo)準(zhǔn)中浮點(diǎn)型數(shù)據(jù)單精度表示方式的基礎(chǔ)上,結(jié)合Borland C++Builder 6.0可視化編程工具,闡述了如何把單精度浮點(diǎn)型數(shù)據(jù)轉(zhuǎn)換成所需要的8位十六進(jìn)制數(shù),以及如何把8位十六進(jìn)制數(shù)轉(zhuǎn)換成單精度浮點(diǎn)類型數(shù)據(jù),并實(shí)現(xiàn)顯示。

關(guān)鍵詞: IEEE 754標(biāo)準(zhǔn); 十六進(jìn)制數(shù); 單精度浮點(diǎn)數(shù); 可視化編程工具

中圖分類號(hào): TN911?34 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 1004?373X(2014)20?0027?04

Convert of floating?point data in IEEE754 based on C++ Builder6.0

ZHAI Zhen?hui1, OU Shi?feng1, LIU Ji?zhang1, ZHONG Quan?xiong2, GAO Ying1

(1. Institute of Optoelectronic Information, Yantai University, Yantai 264005, China; 2. Engineering Training Center, Yantai University, Yantai 264005, China)

Abstract: The single precision and double precision expressive methods which can accurately express a float?point data are stipulated in IEEE754 standard. They are widely in the field, in which the accuracy requirement is high. On the base of studying and analyzing the expression of the 32 bits floating?point, how to translate the floating?point data to the needed hexadecimal data, and how to translate the hexadecimal data to the floating?point data are elaborated in combination with the visual programming tools Borland C++ Builder 6.0, and the expression of the 32 bits floating?point data in the IEEE 754 standard. The data display was realized.

0 引 言

IEEE 754是最廣泛使用的浮點(diǎn)數(shù)運(yùn)算標(biāo)準(zhǔn),為許多CPU與浮點(diǎn)運(yùn)算器所采用[1]。這個(gè)標(biāo)準(zhǔn)定義了表示浮點(diǎn)數(shù)的格式(包括負(fù)零-0)與反常值(denormal number)、一些特殊數(shù)值(無(wú)窮與非數(shù)值(NaN))以及這些數(shù)值的“浮點(diǎn)數(shù)運(yùn)算子”。它規(guī)定了4種表示浮點(diǎn)數(shù)值的方式:?jiǎn)尉_度(32位元)、雙精確度(64位元)、延伸單精確度(43位元以上,很少使用)與延伸雙精確度(79位元以上,通常以80位元實(shí)做)。其中只有32位元模式有強(qiáng)制要求,其他都是選擇性的[2]。

Borland C++ Builder是最知名的可視化C++應(yīng)用程序開發(fā)工具之一,它易學(xué)易用的操作界面和功能強(qiáng)大的應(yīng)用組件,可以讓程序員快速建立各種應(yīng)用程序[3]。Borland C++ Builder不僅繼承了Delphi使用簡(jiǎn)便、功能強(qiáng)大、效率高等特點(diǎn),而且它還結(jié)合C++語(yǔ)言所有的優(yōu)點(diǎn)。C++ Builder可以說(shuō)是至今最容易上手的Windows開發(fā)工具[4]。

目前可視化編程中應(yīng)用IEEE處理整型數(shù)據(jù)到浮點(diǎn)型數(shù)據(jù)運(yùn)算的研究還很少,本文側(cè)重于實(shí)現(xiàn)將8位十六進(jìn)制的數(shù)據(jù)轉(zhuǎn)換成浮點(diǎn)型數(shù)據(jù),應(yīng)用于解析Modbus中RTU格式[5]通信所獲得的浮點(diǎn)型數(shù)據(jù),并編寫了上位機(jī)可視化軟件來(lái)顯示。

1 轉(zhuǎn)換算法介紹

1.1 浮點(diǎn)數(shù)保存格式

浮點(diǎn)型數(shù)據(jù)保存的格式[1]如表1所示。其中:S表示符號(hào)位;“1”表示負(fù)數(shù);“0”表示正數(shù);E代表偏移127的冪數(shù),二進(jìn)制階碼 =(EEEE EEEE)-127;M代表24位的尾數(shù),存放在23個(gè)位中,只存儲(chǔ)23位,最高位固定為1,此方法用最少的位數(shù)實(shí)現(xiàn)了較高的有效位數(shù),提高了精度“0”是一個(gè)特定值,冪數(shù)是0,尾數(shù)也是0。

表1 浮點(diǎn)型數(shù)據(jù)保存的格式

1.2 十六進(jìn)制數(shù)轉(zhuǎn)換為浮點(diǎn)型數(shù)據(jù)

IEEE 754標(biāo)準(zhǔn)中的浮點(diǎn)保存值不是一個(gè)直接的格式,要把十六進(jìn)制轉(zhuǎn)換為一個(gè)浮點(diǎn)數(shù),必須按照表1中所示的方式進(jìn)行分開。這里又分為三種情況:

(1) E部分不全為0也不全為1的情況;

(2) E部分全部為0的情況;

(3) E部分全部為1的情況。

1.2.1 E部分不全為0也不全為1

以0xC1420000為例,先把0xC1420000寫成表1中所示形式,如下:

SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM

1100 0001 0100 0010 0000 0000 0000 0000

由上可以看出,此數(shù)是一個(gè)負(fù)數(shù),二進(jìn)制階碼=(1000 0010)-127 = 3,也就是實(shí)際的冪數(shù)。尾數(shù)是后面的二進(jìn)制數(shù)100 0010 0000 0000 0000 0000,這是已存儲(chǔ)的23位二進(jìn)制,還有一位沒(méi)有被存儲(chǔ)的最高位,固定為1,所以整個(gè)尾數(shù)即:1100 0010 0000 0000 0000 0000則根據(jù)實(shí)際的冪數(shù),浮點(diǎn)型數(shù)為:

[2k×i=023M×2i-23=-12.25] (1)

1.2.2 E部分全為0

這是一種非規(guī)格化的數(shù)據(jù),此時(shí)k=1-(27-1)=-126,完整的位數(shù)部分為0MMM MMMM MMMM MMMM MMMM MMMM。以0x800BCAEF為例,先把0x800BCAEF寫成表1中所示形式,如下:

SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM

1000 0000 0000 1011 1100 1010 1110 1111

由上可以看出,此數(shù)是一個(gè)負(fù)數(shù),二進(jìn)制階碼k=1-127 =-126,也就是實(shí)際的冪數(shù)。

尾數(shù)是后面的二進(jìn)制數(shù)000 1011 1100 1010 1110 1111,這是已存儲(chǔ)的23位二進(jìn)制,還有一位沒(méi)有被存儲(chǔ)的最高位,固定為1,所以整個(gè)尾數(shù)即:1000 1011 1100 1010 1110 1111,則根據(jù)實(shí)際的冪數(shù),浮點(diǎn)型數(shù)為:[2k×i=023M×2i-23=-1.082 989 314 25e-39] (2)

1.2.3 E部分全部為1

如果E部分全為1,則系數(shù)k=28-1=127,此時(shí)又分兩大類情況:

(1) 尾數(shù)是0的情況,這類情況下的數(shù)要么是正無(wú)窮大要么是負(fù)無(wú)窮大;

(2) 尾數(shù)不全為0的情況,根據(jù)IEEE 754標(biāo)準(zhǔn),這類情況是表示的一個(gè)沒(méi)有被定義的數(shù),也就是不存在這樣的數(shù)。

結(jié)合以上三部分的分析可得出計(jì)算步驟如下:

(1) 先判斷十六進(jìn)制數(shù)的最高位是否為1:若為1則是負(fù)數(shù),若為0則是正數(shù);

(2) 把該數(shù)右移23位并和0xFF相與,得到二進(jìn)制數(shù)(EEEE EEEE);

(3) 把步驟(2)得到的二進(jìn)制數(shù)(EEEE EEEE)減127得到二進(jìn)制的最高位冪數(shù)(設(shè)為k);

(4) 把原數(shù)和0x7FFFFF相與得到不帶最高位的尾數(shù)(MMM MMMM MMMM MMMM MMMM MMMM),然后再把得到的尾數(shù)的最高數(shù)置“1”,即得到完整的尾數(shù):(1MMM MMMM MMMM MMMM MMMM MMMM);

(5) 在步驟(4)中得到的尾數(shù)的24位二進(jìn)制數(shù)乘以2k并相加即是所求浮點(diǎn)數(shù)

2 編程實(shí)現(xiàn)

打開Borland C++ Builder 6.0,在空白的Form1上放置5個(gè)Edit控件,2個(gè)Label控件,1個(gè)按鈕,布局Form上的控件并修改屬性[3],如圖1所示。

圖1 軟件設(shè)計(jì)界面

軟件工作流程如圖2所示。

3 仿真結(jié)果

把前面舉例的數(shù)據(jù)0xC1420000進(jìn)行計(jì)算,計(jì)算結(jié)果如圖3所示。可由圖3看出計(jì)算結(jié)果和第1.2.1中計(jì)算結(jié)果一致。

其次再把第1.2.2部分中所舉的數(shù)據(jù)用軟件進(jìn)行計(jì)算,結(jié)果如圖3所示。

可由圖4看出,計(jì)算結(jié)果與第1.2.2部分中分析得出的結(jié)果一致。最后把第1.2.3部分中描述的情況用軟件實(shí)現(xiàn),結(jié)果如圖5所示。

圖5顯示的是E部分全部為1且尾數(shù)部分不全為0的情況的計(jì)算結(jié)果。

圖3 E部分不全為0也不全為1數(shù)據(jù)計(jì)算結(jié)果

圖4 E部分全為0數(shù)據(jù)計(jì)算結(jié)果

圖5 E部分全為1且尾數(shù)部分不全為0的數(shù)據(jù)計(jì)算

圖6上半部分顯示的是E部分全部為“1”且尾數(shù)部分全為“0”的一種計(jì)算。由于最高位為“1”,所以計(jì)算結(jié)果是負(fù)無(wú)窮大;下半部分是另外一種計(jì)算,由于最高位是“0”,所以計(jì)算結(jié)果是正無(wú)窮大。

圖6 E部分全為1且尾數(shù)部分全為0的計(jì)算

另外本文又仿真了一組Modbus協(xié)議中表示溫度的十六進(jìn)制數(shù)據(jù),轉(zhuǎn)換成浮點(diǎn)型數(shù)據(jù),仿真結(jié)果如圖7所示。

圖7 溫度數(shù)據(jù)仿真結(jié)果

4 仿真結(jié)果驗(yàn)證

為了驗(yàn)證仿真結(jié)果的正確性,本文編寫了從浮點(diǎn)型數(shù)據(jù)轉(zhuǎn)換成十六進(jìn)制數(shù)據(jù)的計(jì)算軟件,將之前的數(shù)據(jù)進(jìn)行一一驗(yàn)證,驗(yàn)證結(jié)果如圖8、圖9所示。

圖8 數(shù)據(jù)仿真結(jié)果驗(yàn)證

圖9 溫度數(shù)據(jù)仿真結(jié)果驗(yàn)證

為確保本文中計(jì)算軟件的無(wú)誤計(jì)算,本文在-1 000~1 000之間隨機(jī)取數(shù)進(jìn)行了大量的數(shù)據(jù)轉(zhuǎn)換計(jì)算實(shí)驗(yàn),并隨機(jī)記錄了10組數(shù)據(jù),如表2所示。

由表2中數(shù)據(jù)仿真結(jié)果及其驗(yàn)證可以看出本文中所編寫的轉(zhuǎn)換算法的精度是非常高的,能夠滿足高精度測(cè)量?jī)x器的數(shù)據(jù)轉(zhuǎn)換使用,而且可以看出小數(shù)點(diǎn)后保留的位數(shù)越多得出的結(jié)果越接近原始的數(shù)據(jù)。

5 結(jié) 論

利用Borland C++Builder 6.0編程開發(fā)環(huán)境完成的十六進(jìn)制整型數(shù)據(jù)轉(zhuǎn)換為浮點(diǎn)型數(shù)據(jù)的軟件實(shí)現(xiàn)了從整型數(shù)據(jù)到浮點(diǎn)型數(shù)據(jù)的轉(zhuǎn)換計(jì)算,經(jīng)過(guò)二次開發(fā)該軟件可被用于Modbus通信協(xié)議中高精度浮點(diǎn)型數(shù)據(jù)的傳輸打包、解析和顯示。另外,本文也完成了從浮點(diǎn)型數(shù)據(jù)到十六進(jìn)制整型數(shù)據(jù)的轉(zhuǎn)換編程及仿真顯示。

參考文獻(xiàn)

[1] Microprocessor Standards Committee of the IEEE Computer Society. IEEE Std754?1985 IEEE standard for floating?point arithmetic [S]. USA: Microprocessor Standards Committee of the IEEE Computer Society, 1985.

[2] 程展鵬.Borland C++ Builder 6 應(yīng)用開發(fā)技術(shù)解析[M].北京:清華大學(xué)出版社,2003.

[3] 譚浩強(qiáng).C語(yǔ)言程序設(shè)計(jì)[M].4版.北京:清華大學(xué)出版社,2010.

[4] 吳逸賢,吳目成.精彩C++ Builder 6程序設(shè)計(jì)[M].北京:科學(xué)出版社,2003.

[5] 全國(guó)工業(yè)過(guò)程測(cè)量和控制標(biāo)準(zhǔn)化技術(shù)委員會(huì).GB/T19582?2008 Modbus通信協(xié)議[S].北京:中國(guó)標(biāo)準(zhǔn)出版社,2008.

[6] 陳鵬,蔡雪梅.NIOS浮點(diǎn)運(yùn)算定制指令的實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2011,34(10):166?168.

[7] 唐小明,張濤,王貞杰,等.一種新的基于FPGA的數(shù)據(jù)格式轉(zhuǎn)換方法[J].現(xiàn)代電子技術(shù),2011,34(16):110?112.

[8] 謝躍雷,陳敏.粒子濾波算法中浮點(diǎn)指數(shù)函數(shù)的FPGA設(shè)計(jì)實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2008,31(18):119?121.

Keywords: IEEE 754 standard; hexadecimal number; floating?point data with single precision; visual programming tool

由上可以看出,此數(shù)是一個(gè)負(fù)數(shù),二進(jìn)制階碼=(1000 0010)-127 = 3,也就是實(shí)際的冪數(shù)。尾數(shù)是后面的二進(jìn)制數(shù)100 0010 0000 0000 0000 0000,這是已存儲(chǔ)的23位二進(jìn)制,還有一位沒(méi)有被存儲(chǔ)的最高位,固定為1,所以整個(gè)尾數(shù)即:1100 0010 0000 0000 0000 0000則根據(jù)實(shí)際的冪數(shù),浮點(diǎn)型數(shù)為:

[2k×i=023M×2i-23=-12.25] (1)

1.2.2 E部分全為0

這是一種非規(guī)格化的數(shù)據(jù),此時(shí)k=1-(27-1)=-126,完整的位數(shù)部分為0MMM MMMM MMMM MMMM MMMM MMMM。以0x800BCAEF為例,先把0x800BCAEF寫成表1中所示形式,如下:

SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM

1000 0000 0000 1011 1100 1010 1110 1111

由上可以看出,此數(shù)是一個(gè)負(fù)數(shù),二進(jìn)制階碼k=1-127 =-126,也就是實(shí)際的冪數(shù)。

尾數(shù)是后面的二進(jìn)制數(shù)000 1011 1100 1010 1110 1111,這是已存儲(chǔ)的23位二進(jìn)制,還有一位沒(méi)有被存儲(chǔ)的最高位,固定為1,所以整個(gè)尾數(shù)即:1000 1011 1100 1010 1110 1111,則根據(jù)實(shí)際的冪數(shù),浮點(diǎn)型數(shù)為:[2k×i=023M×2i-23=-1.082 989 314 25e-39] (2)

1.2.3 E部分全部為1

如果E部分全為1,則系數(shù)k=28-1=127,此時(shí)又分兩大類情況:

(1) 尾數(shù)是0的情況,這類情況下的數(shù)要么是正無(wú)窮大要么是負(fù)無(wú)窮大;

(2) 尾數(shù)不全為0的情況,根據(jù)IEEE 754標(biāo)準(zhǔn),這類情況是表示的一個(gè)沒(méi)有被定義的數(shù),也就是不存在這樣的數(shù)。

結(jié)合以上三部分的分析可得出計(jì)算步驟如下:

(1) 先判斷十六進(jìn)制數(shù)的最高位是否為1:若為1則是負(fù)數(shù),若為0則是正數(shù);

(2) 把該數(shù)右移23位并和0xFF相與,得到二進(jìn)制數(shù)(EEEE EEEE);

(3) 把步驟(2)得到的二進(jìn)制數(shù)(EEEE EEEE)減127得到二進(jìn)制的最高位冪數(shù)(設(shè)為k);

(4) 把原數(shù)和0x7FFFFF相與得到不帶最高位的尾數(shù)(MMM MMMM MMMM MMMM MMMM MMMM),然后再把得到的尾數(shù)的最高數(shù)置“1”,即得到完整的尾數(shù):(1MMM MMMM MMMM MMMM MMMM MMMM);

(5) 在步驟(4)中得到的尾數(shù)的24位二進(jìn)制數(shù)乘以2k并相加即是所求浮點(diǎn)數(shù)

2 編程實(shí)現(xiàn)

打開Borland C++ Builder 6.0,在空白的Form1上放置5個(gè)Edit控件,2個(gè)Label控件,1個(gè)按鈕,布局Form上的控件并修改屬性[3],如圖1所示。

圖1 軟件設(shè)計(jì)界面

軟件工作流程如圖2所示。

3 仿真結(jié)果

把前面舉例的數(shù)據(jù)0xC1420000進(jìn)行計(jì)算,計(jì)算結(jié)果如圖3所示。可由圖3看出計(jì)算結(jié)果和第1.2.1中計(jì)算結(jié)果一致。

其次再把第1.2.2部分中所舉的數(shù)據(jù)用軟件進(jìn)行計(jì)算,結(jié)果如圖3所示。

可由圖4看出,計(jì)算結(jié)果與第1.2.2部分中分析得出的結(jié)果一致。最后把第1.2.3部分中描述的情況用軟件實(shí)現(xiàn),結(jié)果如圖5所示。

圖5顯示的是E部分全部為1且尾數(shù)部分不全為0的情況的計(jì)算結(jié)果。

圖3 E部分不全為0也不全為1數(shù)據(jù)計(jì)算結(jié)果

圖4 E部分全為0數(shù)據(jù)計(jì)算結(jié)果

圖5 E部分全為1且尾數(shù)部分不全為0的數(shù)據(jù)計(jì)算

圖6上半部分顯示的是E部分全部為“1”且尾數(shù)部分全為“0”的一種計(jì)算。由于最高位為“1”,所以計(jì)算結(jié)果是負(fù)無(wú)窮大;下半部分是另外一種計(jì)算,由于最高位是“0”,所以計(jì)算結(jié)果是正無(wú)窮大。

圖6 E部分全為1且尾數(shù)部分全為0的計(jì)算

另外本文又仿真了一組Modbus協(xié)議中表示溫度的十六進(jìn)制數(shù)據(jù),轉(zhuǎn)換成浮點(diǎn)型數(shù)據(jù),仿真結(jié)果如圖7所示。

圖7 溫度數(shù)據(jù)仿真結(jié)果

4 仿真結(jié)果驗(yàn)證

為了驗(yàn)證仿真結(jié)果的正確性,本文編寫了從浮點(diǎn)型數(shù)據(jù)轉(zhuǎn)換成十六進(jìn)制數(shù)據(jù)的計(jì)算軟件,將之前的數(shù)據(jù)進(jìn)行一一驗(yàn)證,驗(yàn)證結(jié)果如圖8、圖9所示。

圖8 數(shù)據(jù)仿真結(jié)果驗(yàn)證

圖9 溫度數(shù)據(jù)仿真結(jié)果驗(yàn)證

為確保本文中計(jì)算軟件的無(wú)誤計(jì)算,本文在-1 000~1 000之間隨機(jī)取數(shù)進(jìn)行了大量的數(shù)據(jù)轉(zhuǎn)換計(jì)算實(shí)驗(yàn),并隨機(jī)記錄了10組數(shù)據(jù),如表2所示。

由表2中數(shù)據(jù)仿真結(jié)果及其驗(yàn)證可以看出本文中所編寫的轉(zhuǎn)換算法的精度是非常高的,能夠滿足高精度測(cè)量?jī)x器的數(shù)據(jù)轉(zhuǎn)換使用,而且可以看出小數(shù)點(diǎn)后保留的位數(shù)越多得出的結(jié)果越接近原始的數(shù)據(jù)。

5 結(jié) 論

利用Borland C++Builder 6.0編程開發(fā)環(huán)境完成的十六進(jìn)制整型數(shù)據(jù)轉(zhuǎn)換為浮點(diǎn)型數(shù)據(jù)的軟件實(shí)現(xiàn)了從整型數(shù)據(jù)到浮點(diǎn)型數(shù)據(jù)的轉(zhuǎn)換計(jì)算,經(jīng)過(guò)二次開發(fā)該軟件可被用于Modbus通信協(xié)議中高精度浮點(diǎn)型數(shù)據(jù)的傳輸打包、解析和顯示。另外,本文也完成了從浮點(diǎn)型數(shù)據(jù)到十六進(jìn)制整型數(shù)據(jù)的轉(zhuǎn)換編程及仿真顯示。

參考文獻(xiàn)

[1] Microprocessor Standards Committee of the IEEE Computer Society. IEEE Std754?1985 IEEE standard for floating?point arithmetic [S]. USA: Microprocessor Standards Committee of the IEEE Computer Society, 1985.

[2] 程展鵬.Borland C++ Builder 6 應(yīng)用開發(fā)技術(shù)解析[M].北京:清華大學(xué)出版社,2003.

[3] 譚浩強(qiáng).C語(yǔ)言程序設(shè)計(jì)[M].4版.北京:清華大學(xué)出版社,2010.

[4] 吳逸賢,吳目成.精彩C++ Builder 6程序設(shè)計(jì)[M].北京:科學(xué)出版社,2003.

[5] 全國(guó)工業(yè)過(guò)程測(cè)量和控制標(biāo)準(zhǔn)化技術(shù)委員會(huì).GB/T19582?2008 Modbus通信協(xié)議[S].北京:中國(guó)標(biāo)準(zhǔn)出版社,2008.

[6] 陳鵬,蔡雪梅.NIOS浮點(diǎn)運(yùn)算定制指令的實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2011,34(10):166?168.

[7] 唐小明,張濤,王貞杰,等.一種新的基于FPGA的數(shù)據(jù)格式轉(zhuǎn)換方法[J].現(xiàn)代電子技術(shù),2011,34(16):110?112.

[8] 謝躍雷,陳敏.粒子濾波算法中浮點(diǎn)指數(shù)函數(shù)的FPGA設(shè)計(jì)實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2008,31(18):119?121.

Keywords: IEEE 754 standard; hexadecimal number; floating?point data with single precision; visual programming tool

由上可以看出,此數(shù)是一個(gè)負(fù)數(shù),二進(jìn)制階碼=(1000 0010)-127 = 3,也就是實(shí)際的冪數(shù)。尾數(shù)是后面的二進(jìn)制數(shù)100 0010 0000 0000 0000 0000,這是已存儲(chǔ)的23位二進(jìn)制,還有一位沒(méi)有被存儲(chǔ)的最高位,固定為1,所以整個(gè)尾數(shù)即:1100 0010 0000 0000 0000 0000則根據(jù)實(shí)際的冪數(shù),浮點(diǎn)型數(shù)為:

[2k×i=023M×2i-23=-12.25] (1)

1.2.2 E部分全為0

這是一種非規(guī)格化的數(shù)據(jù),此時(shí)k=1-(27-1)=-126,完整的位數(shù)部分為0MMM MMMM MMMM MMMM MMMM MMMM。以0x800BCAEF為例,先把0x800BCAEF寫成表1中所示形式,如下:

SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM

1000 0000 0000 1011 1100 1010 1110 1111

由上可以看出,此數(shù)是一個(gè)負(fù)數(shù),二進(jìn)制階碼k=1-127 =-126,也就是實(shí)際的冪數(shù)。

尾數(shù)是后面的二進(jìn)制數(shù)000 1011 1100 1010 1110 1111,這是已存儲(chǔ)的23位二進(jìn)制,還有一位沒(méi)有被存儲(chǔ)的最高位,固定為1,所以整個(gè)尾數(shù)即:1000 1011 1100 1010 1110 1111,則根據(jù)實(shí)際的冪數(shù),浮點(diǎn)型數(shù)為:[2k×i=023M×2i-23=-1.082 989 314 25e-39] (2)

1.2.3 E部分全部為1

如果E部分全為1,則系數(shù)k=28-1=127,此時(shí)又分兩大類情況:

(1) 尾數(shù)是0的情況,這類情況下的數(shù)要么是正無(wú)窮大要么是負(fù)無(wú)窮大;

(2) 尾數(shù)不全為0的情況,根據(jù)IEEE 754標(biāo)準(zhǔn),這類情況是表示的一個(gè)沒(méi)有被定義的數(shù),也就是不存在這樣的數(shù)。

結(jié)合以上三部分的分析可得出計(jì)算步驟如下:

(1) 先判斷十六進(jìn)制數(shù)的最高位是否為1:若為1則是負(fù)數(shù),若為0則是正數(shù);

(2) 把該數(shù)右移23位并和0xFF相與,得到二進(jìn)制數(shù)(EEEE EEEE);

(3) 把步驟(2)得到的二進(jìn)制數(shù)(EEEE EEEE)減127得到二進(jìn)制的最高位冪數(shù)(設(shè)為k);

(4) 把原數(shù)和0x7FFFFF相與得到不帶最高位的尾數(shù)(MMM MMMM MMMM MMMM MMMM MMMM),然后再把得到的尾數(shù)的最高數(shù)置“1”,即得到完整的尾數(shù):(1MMM MMMM MMMM MMMM MMMM MMMM);

(5) 在步驟(4)中得到的尾數(shù)的24位二進(jìn)制數(shù)乘以2k并相加即是所求浮點(diǎn)數(shù)

2 編程實(shí)現(xiàn)

打開Borland C++ Builder 6.0,在空白的Form1上放置5個(gè)Edit控件,2個(gè)Label控件,1個(gè)按鈕,布局Form上的控件并修改屬性[3],如圖1所示。

圖1 軟件設(shè)計(jì)界面

軟件工作流程如圖2所示。

3 仿真結(jié)果

把前面舉例的數(shù)據(jù)0xC1420000進(jìn)行計(jì)算,計(jì)算結(jié)果如圖3所示。可由圖3看出計(jì)算結(jié)果和第1.2.1中計(jì)算結(jié)果一致。

其次再把第1.2.2部分中所舉的數(shù)據(jù)用軟件進(jìn)行計(jì)算,結(jié)果如圖3所示。

可由圖4看出,計(jì)算結(jié)果與第1.2.2部分中分析得出的結(jié)果一致。最后把第1.2.3部分中描述的情況用軟件實(shí)現(xiàn),結(jié)果如圖5所示。

圖5顯示的是E部分全部為1且尾數(shù)部分不全為0的情況的計(jì)算結(jié)果。

圖3 E部分不全為0也不全為1數(shù)據(jù)計(jì)算結(jié)果

圖4 E部分全為0數(shù)據(jù)計(jì)算結(jié)果

圖5 E部分全為1且尾數(shù)部分不全為0的數(shù)據(jù)計(jì)算

圖6上半部分顯示的是E部分全部為“1”且尾數(shù)部分全為“0”的一種計(jì)算。由于最高位為“1”,所以計(jì)算結(jié)果是負(fù)無(wú)窮大;下半部分是另外一種計(jì)算,由于最高位是“0”,所以計(jì)算結(jié)果是正無(wú)窮大。

圖6 E部分全為1且尾數(shù)部分全為0的計(jì)算

另外本文又仿真了一組Modbus協(xié)議中表示溫度的十六進(jìn)制數(shù)據(jù),轉(zhuǎn)換成浮點(diǎn)型數(shù)據(jù),仿真結(jié)果如圖7所示。

圖7 溫度數(shù)據(jù)仿真結(jié)果

4 仿真結(jié)果驗(yàn)證

為了驗(yàn)證仿真結(jié)果的正確性,本文編寫了從浮點(diǎn)型數(shù)據(jù)轉(zhuǎn)換成十六進(jìn)制數(shù)據(jù)的計(jì)算軟件,將之前的數(shù)據(jù)進(jìn)行一一驗(yàn)證,驗(yàn)證結(jié)果如圖8、圖9所示。

圖8 數(shù)據(jù)仿真結(jié)果驗(yàn)證

圖9 溫度數(shù)據(jù)仿真結(jié)果驗(yàn)證

為確保本文中計(jì)算軟件的無(wú)誤計(jì)算,本文在-1 000~1 000之間隨機(jī)取數(shù)進(jìn)行了大量的數(shù)據(jù)轉(zhuǎn)換計(jì)算實(shí)驗(yàn),并隨機(jī)記錄了10組數(shù)據(jù),如表2所示。

由表2中數(shù)據(jù)仿真結(jié)果及其驗(yàn)證可以看出本文中所編寫的轉(zhuǎn)換算法的精度是非常高的,能夠滿足高精度測(cè)量?jī)x器的數(shù)據(jù)轉(zhuǎn)換使用,而且可以看出小數(shù)點(diǎn)后保留的位數(shù)越多得出的結(jié)果越接近原始的數(shù)據(jù)。

5 結(jié) 論

利用Borland C++Builder 6.0編程開發(fā)環(huán)境完成的十六進(jìn)制整型數(shù)據(jù)轉(zhuǎn)換為浮點(diǎn)型數(shù)據(jù)的軟件實(shí)現(xiàn)了從整型數(shù)據(jù)到浮點(diǎn)型數(shù)據(jù)的轉(zhuǎn)換計(jì)算,經(jīng)過(guò)二次開發(fā)該軟件可被用于Modbus通信協(xié)議中高精度浮點(diǎn)型數(shù)據(jù)的傳輸打包、解析和顯示。另外,本文也完成了從浮點(diǎn)型數(shù)據(jù)到十六進(jìn)制整型數(shù)據(jù)的轉(zhuǎn)換編程及仿真顯示。

參考文獻(xiàn)

[1] Microprocessor Standards Committee of the IEEE Computer Society. IEEE Std754?1985 IEEE standard for floating?point arithmetic [S]. USA: Microprocessor Standards Committee of the IEEE Computer Society, 1985.

[2] 程展鵬.Borland C++ Builder 6 應(yīng)用開發(fā)技術(shù)解析[M].北京:清華大學(xué)出版社,2003.

[3] 譚浩強(qiáng).C語(yǔ)言程序設(shè)計(jì)[M].4版.北京:清華大學(xué)出版社,2010.

[4] 吳逸賢,吳目成.精彩C++ Builder 6程序設(shè)計(jì)[M].北京:科學(xué)出版社,2003.

[5] 全國(guó)工業(yè)過(guò)程測(cè)量和控制標(biāo)準(zhǔn)化技術(shù)委員會(huì).GB/T19582?2008 Modbus通信協(xié)議[S].北京:中國(guó)標(biāo)準(zhǔn)出版社,2008.

[6] 陳鵬,蔡雪梅.NIOS浮點(diǎn)運(yùn)算定制指令的實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2011,34(10):166?168.

[7] 唐小明,張濤,王貞杰,等.一種新的基于FPGA的數(shù)據(jù)格式轉(zhuǎn)換方法[J].現(xiàn)代電子技術(shù),2011,34(16):110?112.

[8] 謝躍雷,陳敏.粒子濾波算法中浮點(diǎn)指數(shù)函數(shù)的FPGA設(shè)計(jì)實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2008,31(18):119?121.

Keywords: IEEE 754 standard; hexadecimal number; floating?point data with single precision; visual programming tool

主站蜘蛛池模板: 欧美天天干| 国产91精品最新在线播放| 国产精品欧美日本韩免费一区二区三区不卡 | 伊人久久精品无码麻豆精品| 日韩亚洲综合在线| 国产在线精品99一区不卡| 中文一级毛片| 91极品美女高潮叫床在线观看| av在线无码浏览| 精品国产自在现线看久久| 黄色成年视频| 手机永久AV在线播放| 一本大道在线一本久道| 亚洲免费黄色网| 国产jizz| 91青青视频| 日本午夜视频在线观看| 成人自拍视频在线观看| av在线手机播放| 亚洲综合香蕉| 天天色天天综合网| 国产精品视频第一专区| 丁香亚洲综合五月天婷婷| 99国产精品国产| 亚洲激情99| 亚洲国产成人超福利久久精品| 久久一本日韩精品中文字幕屁孩| 综合色88| 98精品全国免费观看视频| 国产色婷婷| 毛片基地视频| 国产精品亚洲一区二区三区在线观看| 美女视频黄频a免费高清不卡| 国产男女XX00免费观看| 成人午夜视频在线| 91成人在线免费视频| 97国产在线观看| 91成人免费观看| 亚洲视频色图| 亚洲欧美成aⅴ人在线观看 | 欧美专区日韩专区| 午夜日韩久久影院| 国产特一级毛片| 强乱中文字幕在线播放不卡| 亚洲 欧美 偷自乱 图片| 就去吻亚洲精品国产欧美| 亚洲中文字幕国产av| 一本一道波多野结衣一区二区 | 国产青青草视频| 国产va免费精品观看| 人人91人人澡人人妻人人爽| 美女潮喷出白浆在线观看视频| 91久久国产热精品免费| 无码日韩精品91超碰| 亚洲 欧美 日韩综合一区| 黄片一区二区三区| jijzzizz老师出水喷水喷出| 中文字幕永久在线看| аⅴ资源中文在线天堂| 国产SUV精品一区二区6| 老司机精品久久| 制服丝袜 91视频| 中文字幕中文字字幕码一二区| 高清久久精品亚洲日韩Av| 精品自拍视频在线观看| 日韩av无码精品专区| 99re经典视频在线| 在线观看亚洲国产| 中国成人在线视频| 熟妇丰满人妻| 91精选国产大片| 91成人在线观看| 中文字幕丝袜一区二区| 99激情网| 无码中字出轨中文人妻中文中| 久久综合九色综合97网| 91久久夜色精品国产网站 | 91麻豆精品国产91久久久久| 国产产在线精品亚洲aavv| 精品一区二区三区自慰喷水| 欧美精品高清| 97成人在线视频|