浮点数按照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" union aaa main() a.s[0] = 0x00; if(f1 < 0.00) f1 = 3.1415; ((unsigned char *)&a.f)[0] = 0x00; ((unsigned char *)&a.f)[0] = 0xff; a.f = 1; } 结论如下: 1,浮点数0的在单片机中存储为00 00 00 00H 2,atof(*p)函数的使用前提是:保证*p不是空字符串,否则输出-1.#QNAN(负无穷大)。 -------特别注意,一些GPS模块输出方向值不稳定 ,时常为空, 此处留心。 3,和上层软件通信时注意浮点数的高低位转换。 4,统计得浮点数运算机器周期大概如下(根据编译器优化级别不同略有不同): atof() 129 + 44 - 56 × 215 / 40(不可思议,比加减还少,??) = 8 > < 79 对实时运算要适度把握,尽量用移位运算代替乘法。 |