Vdsp(bf561)中的浮点运算(2):float的疑问
写一行很简单的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还有什么机关不成? |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |