boat030 发表于 2006-10-14 09:56:05

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

如题. 如果要传输浮点数, 应该怎办? 把浮点数分成四个字节? 还是有更好的办法?

discoverer8713 发表于 2006-10-14 11:23:36

关注,

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

laoma 发表于 2006-10-14 11:46:21

volatile float Pi = 3.14159;

unsigned char *Pt;

unsigned char Arr;



void main( void )

{

unsigned char i;



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



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

{

      Arr = *Pt++;

}

while(1);

}

appleboy 发表于 2006-10-14 12:09:11

1楼,你定义的时候用联合就OK了,不用自己操心

2楼,当然是ftoa了

3楼,太罗嗦了!

passerby 发表于 2006-10-14 15:19:49

这个问题我关注很长时间了,很多人问过,很多高手都解答过,

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

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

/*

希望的值是

Arr=33

Arr=31

Arr=34

Arr=31

实际的值是

Arr=208

Arr=15

Arr=73

Arr=64

*/

程序就是2楼的程序,

#include <stdio.h>



volatile float Pi = 3.14159;

unsigned char *Pt;

unsigned char Arr;



int main( void )

{

unsigned char i;

   

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

   

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

{

      Arr = *Pt++;

}

printf("%d
",5);

printf("%d
",Arr);

printf("%d
",Arr);

printf("%d
",Arr);

printf("%d
",Arr);

//while(1);

}

在单片机上面试验

USART_Transmit(Arr+48);

USART_Transmit(Arr+48);

USART_Transmit(Arr+48);

USART_Transmit(Arr+48);

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



所以还是得问问,

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

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

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

schwarz 发表于 2006-10-14 15:39:56

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

passerby 发表于 2006-10-14 15:45:04

多谢schwarz 指教,我再好好看看.

passerby 发表于 2006-10-14 16:24:53

基本上明白了,再次感谢schwarz.

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

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



#include <stdio.h>



typedef union

{

        floatf;

        unsigned char u;

}Float4Byte;



int main(void)

{

        Float4Byte m1,m2;

        m1.f=-1.2356;

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

        m2.u=m1.u;

        m2.u=m1.u;

        m2.u=m1.u;



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

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

        return 0;

}



运行结果:

m1=-1.235600

m2=-1.235600

laoma 发表于 2006-10-15 21:29:08

楼上用法习惯不太好.............就算要用联合......最好不要那样用......要尽量维持一个变量的数据类型,比不得已不要改变其数据类型........



volatile float Pi = 3.14159;



unsigned char Arr;



typedef union

{

   floatf;

   unsigned char u;

}Float4Byte;



Float4Byte *Pt;



void main( void )

{

unsigned char i;



Pt = (Float4Byte *)(&Pi);



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

{

      Arr = Pt->u;

}

while(1);

}

linxiaolong 发表于 2009-1-7 14:05:04

谢谢,受教了

kengao55 发表于 2009-1-7 15:01:50

关注

haeha 发表于 2009-1-7 19:11:17

存储方式是由编译器和数据类型决定的

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

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

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

野猪奔月 发表于 2013-4-1 13:08:10

谢谢了,参考到了
页: [1]
查看完整版本: 问下关于C的问题: 怎样将一个浮点数拆成四个字节?