<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
快樂蝦
http://blog.csdn.net/lights_joy/
lights@hb165.com
本文適用于
ADI BF561 DSP
Visual DSP++ 5.0 (update 5)
歡迎轉載,但請保留作者信息
寫一行很簡單的 C 代碼:
float a = 1234.56;
用 vdsp 編譯后的匯編代碼為:
R0 = 20972 ( X ) ;
R0.H = 17562 ;
[ FP + 0x10 ] = R0 ;
有點看不懂,呵呵, R0 的值轉換為十六進制就是 0x<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="449" unitname="a">449A</chmetcnv>51EC 。根據 vdsp 文檔的說法,其單精度浮點數格式為:
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 354pt; HEIGHT: 97.5pt" type="#_x0000_t75"><imagedata o:title="" src="file:///F:%5Cdevtemp%5Cmsohtml1%5C01%5Cclip_image001.png"></imagedata></shape>
浮點數計算公式:
<shape id="_x0000_i1026" style="WIDTH: 366pt; HEIGHT: 28.5pt" type="#_x0000_t75"><imagedata o:title="" src="file:///F:%5Cdevtemp%5Cmsohtml1%5C01%5Cclip_image003.png"><font color="#000000" size="3"></font></imagedata></shape>
將 0x<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="449" unitname="a">449A</chmetcnv>51EC 轉換為二進制:
0100 0100 1001 1010 0101 0001 1110 1100
可得:
Sign = 0
Mantissa = 001 1010 0101 0001 1110 1100
Exponent = 1000 1001
按照公式
將 Exponent 轉換為十進制,其值為 137 。
將 Mantissa 轉換為十進制,其值為:
2 -3 + 2 -4 + 2 -6 + 2 -9 + 2 -11 + 2 -15 + 2 -16 + 2 -17 + 2 -18 + 2 -20 + 2 -21 =
0.125 + 0.0625 + 0.015625 + 0.001953125 + 0.00048828125 + 0.000030517578125 + 0.0000152587890625 + 0.00000762939453125 + 0.000003814697265625 + 0.00000095367431640625 + 0.000000476837158203125 = 0.205625057220458984375
代入浮點數計算公式:
(-1) 0 + 1. 205625057220458984375 * 2 (137-127)
= 1234.56005859375
那么編譯器又是如何將 1234.56 轉換為 0x<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="449" unitname="a">449A</chmetcnv>51EC 的呢?
首先轉換整數部分,用 2 除,取余數,其結果為:
1234 / 2 = 617 ….. 0
617 / 2 = 308 …….1
308 / 2 = 154 …….0
154 / 2 = 77 ……...0
77 / 2 = 38 ……….1
38 / 2 = 19 ……….0
19/ 2 = 9 ………….1
9 / 2 = 4………… .1
4/ 2 = 2 …………..0
2/2 = 1……………0
1/2 = 0……………1
即 100 1101 0010 ,用 16 進制表示則為: 0x4d2 。
再轉換小數部分,用 2 乘,取整數位:
0.56 * 2 = 1.12 取 1
0.12 * 2 = 0.24 取 0
0.24 * 2 = 0.48 取 0
0.48 * 2 = 0.96 取 0
0.96 * 2 = 1.92 取 1
0.92 * 2 = 1.84 取 1
0.84 * 2 = 1.68 取 1
0.68 * 2 = 1.36 取 1
0.36 * 2 = 0.72 取 0
0.72 * 2 = 1.44 取 1
0.44 * 2 = 0.88 取 0
0.88 * 2 = 1.76 取 1
0.76 * 2 = 1.52 取 1
小數部分的值為 0.1000 1111 0101 11
所以 1234.56 表示成二進制數就是
100 1101 0010. 1000 1111 0101 11
由于浮點數表示法的尾數部分以 1 開頭,所以上面的這個數可以表示為:
1.00 1101 0010 1000 1111 0101 11 * 2 10
從浮點數的表示公式即可算出
Exponent = 127 + 10 = 137
而尾數部分則為
00 1101 0010 1000 1111 0101 11
因此整個數就是:
0 1000 1001 00 1101 0010 1000 1111 0101 11
符號位 指數 尾數
從整數的角度來看就是:
0100 0100 1001 1010 0101 0001 1110 1011
十六進制表示為:
4 4 <chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="True" sourcevalue="9" unitname="a">9<span style="mso-spacerun: yes"> </span>A</chmetcnv> 5 1 E B
奇怪得很,最后居然有偏差。莫非 VDSP 還有什么機關不成?
參考資料
Vdsp(bf561) 中的浮點運算( 1 ):文檔的說法 (<chsdate w:st="on" isrocdate="False" islunardate="False" day="16" month="12" year="2008">2008-12-16</chsdate>)
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
