DSP

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.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    9    A   5    1   E    B 奇怪得很,最后居然有偏差。莫非VDSP还有什么机关不成?        

参考资料

Vdsp(bf561)中的浮点运算(1):文档的说法(2008-12-16)