Vdsp(bf561)中的浮点运算(2):float的疑问

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

快乐虾

http://blog.csdn.net/lights_joy/

lights@hb165.com

本文适用于

ADI BF561 DSP

优视BF561EVB开发板

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

按照公式

<shape id="_x0000_i1027" style="WIDTH: 408.75pt; HEIGHT: 37.5pt" type="#_x0000_t75" alt=""><imagedata src="file:///F:%5Cdevtemp%5Cmsohtml1%5C01%5Cclip_image005.gif" o:href="http://images.cnblogs.com/cnblogs_com/bossin/WindowsLiveWriter/IEEE754_B489/clip_image006.gif"><font color="#000000" size="3"></font></imagedata></shape>

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.121

0.12 * 2 = 0.240

0.24 * 2 = 0.480

0.48 * 2 = 0.960

0.96 * 2 = 1.921

0.92 * 2 = 1.841

0.84 * 2 = 1.681

0.68 * 2 = 1.361

0.36 * 2 = 0.720

0.72 * 2 = 1.441

0.44 * 2 = 0.880

0.88 * 2 = 1.761

0.76 * 2 = 1.521

小数部分的值为0.1000 1111 0101 11

所以1234.56表示成二进制数就是

100 1101 0010. 1000 1111 0101 11

由于浮点数表示法的尾数部分以1开头,所以上面的这个数可以表示为:

1.00 1101 0010 1000 1111 0101 11 * 210

从浮点数的表示公式即可算出

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>)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值