浮点数的存储与计算

浮点数的存储与计算
2007-08-22 14:38

浮点数按照IEEE标准存储,以单精度为例(32位):

1(符号位,1负0正)+8(指数)+23(尾数)

由于8位指数位表示范围是0—255,而实际应用中指数是有符号数,表示范围是-128——127。

故8位指数为实际指数+127.

例如:7 = (111) = (1.11 * 2exp2)   

8位指数为:2+127 =129 = (1000 0001)

尾数为11

即:0100 0000 1110 0000 0000 0000 = 40 E0 00 00H

另外单片机的存储是低位在前,故浮点数7的存储为40 E0 00 00H

台式机(X86)存储是高位在前,故浮点数7的存储为00 00 E0 40H

我是做了如下测试程序,在KeilC中DEBUG观察所得:

#include "string.h"
#include "stdlib.h"
#include "stdio.h"

union aaa
{
float f;
unsigned char s[4];
}a;
float f1,f2,f3,f4,f5,f6;

main()
{

a.s[0] = 0x00;
a.s[1] = 0x00;
a.s[2] = 0x00;
a.s[3] = 0x00;
f1 = atof(a.s);

if(f1 < 0.00)      f1 = 3.1415;
f2 = 0.1234;
f3 = f1 + f2;
f4 = f1 - f2;
f5 = f1*f2;
f6=   f1/f2;

((unsigned char *)&a.f)[0] = 0x00;
((unsigned char *)&a.f)[1] = 0x00;
((unsigned char *)&a.f)[2] = 0x00;
((unsigned char *)&a.f)[3] = 0x00;

((unsigned char *)&a.f)[0] = 0xff;
((unsigned char *)&a.f)[1] = 0xff;
((unsigned char *)&a.f)[2] = 0xff;
((unsigned char *)&a.f)[3] = 0xff;

a.f = 1;
a.f = 2;
a.f = 7;

}

结论如下:

1,浮点数0的在单片机中存储为00 00 00 00H

2,atof(*p)函数的使用前提是:保证*p不是空字符串,否则输出-1.#QNAN(负无穷大)。

-------特别注意,一些GPS模块输出方向值不稳定 ,时常为空, 此处留心。     

3,和上层软件通信时注意浮点数的高低位转换。

4,统计得浮点数运算机器周期大概如下(根据编译器优化级别不同略有不同):

      atof()        129

      +                    44

      -                     56

     ×                    215

      /                      40(不可思议,比加减还少,??)

      =                      8

     >    <                 79

    对实时运算要适度把握,尽量用移位运算代替乘法。

 

你可能感兴趣的:(浮点数的存储与计算)