Vdsp(bf561)中的浮点运算(2):float的疑问
2019-07-13 17:06发布
生成海报
快乐虾
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的值转换为十六进制就是0x449A51EC。根据vdsp文档的说法,其单精度浮点数格式为:
浮点数计算公式:
将0x449A51EC转换为二进制:
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转换为0x449A51EC的呢?
首先转换整数部分,用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 * 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 9 A 5 1 E B
奇怪得很,最后居然有偏差。莫非VDSP还有什么机关不成?
Vdsp(bf561)中的浮点运算(1):文档的说法(2008-12-16)
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮