搜索
bottom↓
回复: 12

问下关于C的问题: 怎样将一个浮点数拆成四个字节?

[复制链接]

出0入0汤圆

发表于 2006-10-14 09:56:05 | 显示全部楼层 |阅读模式
如题. 如果要传输浮点数, 应该怎办? 把浮点数分成四个字节? 还是有更好的办法?

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2006-10-14 11:23:36 | 显示全部楼层
关注,

如果要用1602B LCD 显示浮点数,大家有什么好的办法?

出0入0汤圆

发表于 2006-10-14 11:46:21 | 显示全部楼层
volatile float Pi = 3.14159;

unsigned char *Pt;

unsigned char Arr[4];



void main( void )

{

  unsigned char i;

  

  Pt = (unsigned char *)(&Pi);

  

  for(i=0; i<4; i++)

  {

      Arr = *Pt++;

  }

  while(1);

}

出0入0汤圆

发表于 2006-10-14 12:09:11 | 显示全部楼层
1楼,你定义的时候用联合就OK了,不用自己操心

2楼,当然是ftoa了

3楼,太罗嗦了!

出0入0汤圆

发表于 2006-10-14 15:19:49 | 显示全部楼层
这个问题我关注很长时间了,很多人问过,很多高手都解答过,

基本答案都是一样的,用指针或者用联合体,性质也是一样的.

但是我试验就是试不出来,像2楼的程序我在pc的标准c,比如tc2.0里面试验则得到:

/*

希望的值是

Arr[0]=33

Arr[1]=31

Arr[2]=34

Arr[3]=31

实际的值是

Arr[0]=208

Arr[1]=15

Arr[2]=73

Arr[3]=64

*/

程序就是2楼的程序,

#include <stdio.h>



volatile float Pi = 3.14159;

unsigned char *Pt;

unsigned char Arr[4];



int main( void )  

{  

  unsigned char i;

   

  Pt = (unsigned char *)(&Pi);

   

  for(i=0; i<4; i++)

  {

      Arr = *Pt++;

  }

  printf("%d
",5);

  printf("%d
",Arr[0]);

  printf("%d
",Arr[1]);

  printf("%d
",Arr[2]);

  printf("%d
",Arr[3]);

  //while(1);

}  

在单片机上面试验

  USART_Transmit(Arr[0]+48);

  USART_Transmit(Arr[1]+48);

  USART_Transmit(Arr[2]+48);

  USART_Transmit(Arr[3]+48);

从串口发出去,则也是错误的,得到 ?yp 这样几个乱字符.



所以还是得问问,

1.是不是pc里面和单片机里面的浮点数的存储方式不一样?

2.像2楼这个程序,我想一定是能正常工作的,但是我试不出来.应该怎样试验?

很初级的问题,拜托2楼的laoma大侠,或其他过路的高手,能给指点一下,尤其是怎么能试验确认,谢谢.

出0入0汤圆

发表于 2006-10-14 15:39:56 | 显示全部楼层
4楼,你对浮点数的理解完全错误,32位浮点数里面是1位符号,23位尾数和8位偏移阶码构成的。所以你写的那些完全是错误的,至于你想要的结果,其方法“【3楼】 appleboy ”已经给出来了,仔细看。

出0入0汤圆

发表于 2006-10-14 15:45:04 | 显示全部楼层
多谢schwarz 指教,我再好好看看.

出0入0汤圆

发表于 2006-10-14 16:24:53 | 显示全部楼层
基本上明白了,再次感谢schwarz.

浮点数是按照一种规则存放在4个字节里面的.描述这个规则的文件叫做IEEE-754.

以下程序仍然是在tc2.0下编译和运行.



#include <stdio.h>



typedef union

{

        float  f;

        unsigned char u[4];

}Float4Byte;



int main(void)

{

        Float4Byte m1,m2;

        m1.f=-1.2356;

        m2.u[0]=m1.u[0];                //假设这里经过了一个传输过程.

        m2.u[1]=m1.u[1];

        m2.u[2]=m1.u[2];

        m2.u[3]=m1.u[3];



        printf("m1=%f
",m1.f);

        printf("m2=%f
",m2.f);

        return 0;

}



运行结果:

m1=-1.235600

m2=-1.235600

出0入0汤圆

发表于 2006-10-15 21:29:08 | 显示全部楼层
楼上用法习惯不太好.............就算要用联合......最好不要那样用......要尽量维持一个变量的数据类型,比不得已不要改变其数据类型........



volatile float Pi = 3.14159;



unsigned char Arr[4];



typedef union

{

   float  f;

   unsigned char u[4];

}Float4Byte;



Float4Byte *Pt;



void main( void )

{

  unsigned char i;



  Pt = (Float4Byte *)(&Pi);



  for(i=0; i<4; i++)

  {

      Arr = Pt->u;

  }

  while(1);

}

出0入0汤圆

发表于 2009-1-7 14:05:04 | 显示全部楼层
谢谢,受教了

出0入0汤圆

发表于 2009-1-7 15:01:50 | 显示全部楼层
关注

出0入0汤圆

发表于 2009-1-7 19:11:17 | 显示全部楼层
存储方式是由编译器和数据类型决定的

我做dsp2812的时候,float,double型变量用ccs编译后,发现都是以4字节存储的

结果直接导致浮点运算精度不够

只好换用arm7,在keil和iar下试验,确定double型以8字节方式存储,才敢继续做下去

出0入0汤圆

发表于 2013-4-1 13:08:10 | 显示全部楼层
谢谢了,参考到了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 01:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表