浮点数与4个字节的转换


前言:

在串口、IIC、SPI等数据传送时基本上都是一次传送一个字节的数据,如果要传送浮点数据?

通常是将浮点数乘以一个倍数,如10,100,1000,10000等,然后将其转换为整型数据再转化为单个字节进行传送。如果这个数据是要进行显示的话,那么这样做并没有什么不好。但是如果这个数是要传输给另端进行继续计算的话,那么就要考虑另一种方法了,就是直接将浮点数据转换为4个单字节,在另一端接受完数据后再转化为浮点数据,这种方式不会造成精度的丢失,计算量也比较小。

程序源码:

[cpp]    [cpp]
[cpp]

  1. #include <stdio.h>
  2. /*
  3. 要点提示:
  4. 1. float和unsigned long具有相同的数据结构长度
  5. 2. union据类型里的数据存放在相同的物理空间
  6. */
  7. typedef union
  8. {
  9. float fdata;
  10. unsigned long ldata;
  11. }FloatLongType;
  12. /*
  13. 将浮点数f转化为4个字节数据存放在byte[4]中
  14. */
  15. void Float_to_Byte(float f,unsigned char byte[])
  16. {
  17. FloatLongType fl;
  18. fl.fdata=f;
  19. byte[0]=(unsigned char)fl.ldata;
  20. byte[1]=(unsigned char)(fl.ldata>>8);
  21. byte[2]=(unsigned char)(fl.ldata>>16);
  22. byte[3]=(unsigned char)(fl.ldata>>24);
  23. }
  24. /*
  25. 将4个字节数据byte[4]转化为浮点数存放在*f中
  26. */
  27. void Byte_to_Float(float *f,unsigned char byte[])
  28. {
  29. FloatLongType fl;
  30. fl.ldata=0;
  31. fl.ldata=byte[3];
  32. fl.ldata=(fl.ldata<<8)|byte[2];
  33. fl.ldata=(fl.ldata<<8)|byte[1];
  34. fl.ldata=(fl.ldata<<8)|byte[0];
  35. *f=fl.fdata;
  36. }
  37. /*
  38. 测试函数
  39. */
  40. int main()
  41. {
  42. float f=123456.789f;
  43. unsigned char byte[4]={0};
  44. printf("float data=%f ",f);
  45. Float_to_Byte(f,byte);
  46. f=789.123456f;
  47. printf("changed float data=%f ",f);
  48. Byte_to_Float(&f,byte);
  49. printf("float data=%f ",f);
  50. return 0;
  51. }

[cpp] #include /* 要点提示: 1. float和unsigned long具有相同的数据结构长度 2. union据类型里的数据存放在相同的物理空间 */ typedef union { float fdata; unsigned long ldata; }FloatLongType; /* 将浮点数f转化为4个字节数据存放在byte[4]中 */ void Float_to_Byte(float f,unsigned char byte[]) { FloatLongType fl; fl.fdata=f; byte[0]=(unsigned char)fl.ldata; byte[1]=(unsigned char)(fl.ldata>>8); byte[2]=(unsigned char)(fl.ldata>>16); byte[3]=(unsigned char)(fl.ldata>>24); } /* 将4个字节数据byte[4]转化为浮点数存放在*f中 */ void Byte_to_Float(float *f,unsigned char byte[]) { FloatLongType fl; fl.ldata=0; fl.ldata=byte[3]; fl.ldata=(fl.ldata<<8)|byte[2]; fl.ldata=(fl.ldata<<8)|byte[1]; fl.ldata=(fl.ldata<<8)|byte[0]; *f=fl.fdata; } /* 测试函数 */ int main() { float f=123456.789f; unsigned char byte[4]={0}; printf("float data=%f ",f); Float_to_Byte(f,byte); f=789.123456f; printf("changed float data=%f ",f); Byte_to_Float(&f,byte); printf("float data=%f ",f); return 0; }

运行结果:

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/290159.html

(0)
上一篇 2022年9月28日
下一篇 2022年9月29日

相关推荐

发表回复

登录后才能评论