打印

单片机中浮点数的存储

[复制链接]
7370|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
雪域流星|  楼主 | 2009-8-5 22:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
IEEE745标准存储浮点型数据
最近编程碰到了要把计算的浮点数据转化成IEEE745形式。也就是在单片机里计算出浮点数据后,把这个浮点数据转化成IEEE745标准,然后把这个标准的数据通过串口发送出去。
对这个标准一窍不通,所以补习了一下功课O(∩_∩)O~
 IEEE二进制浮点数算术标准(IEEE 754)是最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormal number)),一些特殊数值(无穷与非数值(NaN)),以及这些数值的“浮点数运算子”,IEEE 754规定了四种表示浮点数值的方式:单精确度(32位元)、双精确度(64位元)、延伸单精确度(43位元以上,很少使用)与延伸双精确度(79位元以上,通常以80位元实做)。在这我只学习了单精度的数据格式。
单精度二进制小数,使用32个位元存储。
  1
8
23 位长
  +-+--------+-----------------------+
  |S| Exp | Fraction |
  +-+--------+-----------------------+
  偏正值 +127
S为符号位,Exp为指数位,Fraction为有效数位。 指数部分即使用所谓的偏正值形式表示,实际值为表示值与一个固定值(32位的情况是127)的和。采用这种方式表示的目的是简化比较。因为,指数的值可能为正也可能为负,如果采用补码表示的话,全体符号位S和Exp自身的符号位将导致不能简单的进行大小比较。正因为如此,指数部分通常采用一个无符号的正数值存储。单精度的指数部分是−126~+127加上127 ,指数值的大小从1~254(0和255是特殊值)。浮点小数计算时,指数值减去偏正值将是实际的指数大小。
举个例子:
-2.5
十进制-2.5转换成二进制
-10.1
规格化二进制数
-1.01*2^1
计算指数
1+127=128
符号位
指数部分
尾数部分
1 10000000 01000000000000000000000
以单精度(real*4)浮点格式存储该数
1100 0000 0010 0000 0000 0000 0000 0000
0xC020 0000
最终转化的结果就是0XC020,这个数值也是我最终要发送出去的数值,单这种方法只适合手算,因为单片机程序中计算了浮点后,存储形式不可能是标准二进制形式(-10.1),也不清楚浮点型在单片机中到底是如何存储的,网上说通过C语言编写的程序,对浮点数据都是按IEEE745标准存储的,那样在程序中计算后并不需要数据转换。但float型在单片机中占四个字节,而串口发送只能发一个字节,因此我采用共用体的方式发送;
union f_data
{

float temp;

unsigned char fdata[4];
}float_data;
void send_data(void)
{

float_data.temp=-2.5;
send(float_data.fdata[3]);
send(float_data.fdata[2]);
send(float_data.fdata[1]);
send(float_data.fdata[0]);
}
通过串口助手得到:
得到的正好为C0 20 00 00;
这样就完成了串口发送的功能。
另一个单片机接收到这四个数据后,还要还原成float形式,才成正确的使用,因此还要有转化程序,这个程序我使用VC模拟了一下
;
//此函数为IEEE745标准浮点数据,转化成浮现数据显示程序
//张明
#include "stdio.h"
void main()
{
float a;
char data[4]={0xc0,0x20,0x00,0x00};//IEEE745标准-2.5数据格式

char *p;

float *q;

p=data;

q=(float*)p;

a=*q;

printf("%f",a);//转化成浮点型发送出去
}
结果为:
正好转化正确,大功告成呵呵!

相关帖子

沙发
木字四点水| | 2009-8-6 09:45 | 只看该作者
好长啊。。。。。。

使用特权

评论回复
板凳
weicheichei| | 2011-10-26 10:01 | 只看该作者
谢谢楼主

使用特权

评论回复
地板
ayb_ice| | 2011-10-26 10:29 | 只看该作者
这是编程的基本问题

使用特权

评论回复
5
baiyunfei.k.f| | 2011-10-27 11:09 | 只看该作者
就是个联合体

使用特权

评论回复
6
DownCloud| | 2011-10-27 11:23 | 只看该作者
学过汇编的都觉得这个很简单。

使用特权

评论回复
7
spirits_hyx| | 2012-4-22 20:19 | 只看该作者
讲解的真心很好,学习了~

使用特权

评论回复
8
mxh0506| | 2012-4-22 21:41 | 只看该作者
想当年还做过非标准的浮点库,这个是基础啊。

使用特权

评论回复
9
coody| | 2012-4-23 10:57 | 只看该作者
强制转换即可

使用特权

评论回复
10
电子三极管| | 2012-4-23 14:05 | 只看该作者
本人有工控、交通类成熟产品全部技术资料,有意向者联系 非诚请勿扰
https://bbs.21ic.com/icview-328904-1-1.html

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

16

帖子

0

粉丝