快速业务通道

Vdsp(bf561)中的浮点运算(5):float类型表示总结

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30

1.1 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还有什么机关不成?

1.2 FLT_MIN

FLT_MIN是在float.h中定义的一个常量,用以表示单精度浮点数的最小值。

#define FLT_MIN  1.1754943508222875E-38F

那么这个值从何而来?

从浮点数的表示可以知道,尾数必然是大于等于1的,要取最小值,只能将指数设置为最小值,由于浮点数规定将指数为0的情况表示特殊的浮点数,因此指数只能取1,即

0      00000001   00000000000000000000000

符号位    指数     尾数

从16进制整数看它的值就是 0x00 80 00 00。

根据浮点数的计算公式可知这个值为:

1.0 * 2-126

= 1.1754943508222875079687365372222e-38

这个是计算器的计算结果。

1.3 FLT_MAX

FLT_MAX是在float.h中定义的一个常量,用以表示单精度浮点数的最大值。

#define FLT_MAX 3.4028234663852886E+38F

那么这个值从何而来?

从浮点数的表示

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号