当前位置:主页   - 电脑 - 程序设计 - C/C++
Vdsp(bf561)中的浮点运算(2):float的疑问
来源:网络   作者:快乐虾   更新时间:2011-07-19
收藏此页】    【字号    】    【打印】    【关闭

  写一行很简单的C代码:

  float a = 1234.56;

  用vdsp编译后的汇编代码为:

  R0 = 20972 ( X ) ;

  R0.H = 17562 ;

  [ FP + 0x10 ] = R0 ;

  有点看不懂,呵呵,R0的值转换为十六进制就是0x449A51EC。根据vdsp文档的说法,其单精度浮点数格式为:

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

  浮点数计算公式:

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

  将0x449A51EC转换为二进制:

  0100 0100 1001 1010 0101 0001 1110 1100

  可得:

  Sign = 0

  Mantissa = 001 1010 0101 0001 1110 1100

  Exponent = 1000 1001

  按照公式

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

  将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)中的浮点运算(3):FLT_MIN
  • Vdsp(bf561)中的浮点运算(1):文档的说法
其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明