搜索
bottom↓
回复: 12

如何把十进制浮点数转换为十六进制的32位单精度IEEE754格式

[复制链接]

出0入0汤圆

发表于 2015-1-14 17:18:10 | 显示全部楼层 |阅读模式
如何把十进制浮点数转换为十六进制的32位单精度IEEE754格式呢?
比如一个十进制数0d1010.0,转换为IEEE754格式为0x447C8000,然后把数据发送出去,
搜索一番,没找到答案,好像是库函数可以?哪位有代码呢,谢谢。

出0入0汤圆

发表于 2015-1-14 17:27:43 | 显示全部楼层
LZ是来开玩笑的吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-1-14 17:31:15 | 显示全部楼层
这个不需要转换

出0入0汤圆

发表于 2015-1-14 17:31:43 | 显示全部楼层
好吧。正式回复一下;
  1. union  Data
  2. {
  3.     float  srcData;
  4.     u32   memData;
  5. };


  6. float am = 1010.0f;
  7. union Data   d;
  8. void  fun(void)
  9. {
  10.      d.srcData = am;
  11.      printf("%u \r\n", d.memData);
  12. }
复制代码

出0入0汤圆

 楼主| 发表于 2015-1-14 17:47:57 | 显示全部楼层
xf331785508 发表于 2015-1-14 17:31
好吧。正式回复一下;


感谢
原来的浮点数用的是double类型,应该对此没什么影响吧?
并且要通过一个数值发送出去
double a;
unsinged char txdata[4];

void func(void)
{
        a=1010.0f;                 //10进制
        txdata[0]=(a>>24)&0xff;
        txdata[1]=(a>>16)&0xff;
        txdata[2]=(a>>8)&0xff;
        txdata[3]=a&0xff;
        //发送代码
}

总感觉哪不对呀?

出0入37汤圆

发表于 2015-1-14 17:52:43 | 显示全部楼层
不需要复制一遍的,这个跟发送结构体内容一样的,你把首地址和长度给发送函数就可以了,发送函数会自己从你的内存区域读取他需要的数据
float a=0.12356;
send((char*)&a,sizeof(a));
无论a是什么类型均有效

出0入0汤圆

发表于 2015-1-14 22:35:37 | 显示全部楼层
以为是verilog

出0入0汤圆

 楼主| 发表于 2015-1-15 16:37:40 | 显示全部楼层
xf331785508 发表于 2015-1-14 17:31
好吧。正式回复一下;

这种办法貌似不行啊,能得到整数部分,小数部分总是被抹去,变为0,

出0入0汤圆

发表于 2015-1-15 17:49:51 | 显示全部楼层
arm7tdmi 发表于 2015-1-15 16:37
这种办法貌似不行啊,能得到整数部分,小数部分总是被抹去,变为0,

那只是精度问题。你想,如果你的小数为 xxxxxxxx.xxxxx  可能整数部分大小已经超过32位小数整数上限了。 不行就搞成double型。

出0入0汤圆

发表于 2015-1-15 17:53:30 | 显示全部楼层
本帖最后由 xf331785508 于 2015-1-15 18:08 编辑
arm7tdmi 发表于 2015-1-15 16:37
这种办法貌似不行啊,能得到整数部分,小数部分总是被抹去,变为0,

  1. union  Data
  2. {
  3.     double  srcData;
  4.     u8        memData[sizeof(srcData)];
  5. };


  6. double am = 1010.0f;
  7. union Data   d;
  8. void  fun(void)
  9. {
  10.      unsigned char table[sizeof(am)] = {0}, i = 0, *p = NULL;
  11.      p = (unsigned char*)&am;
  12.      for( i = 0; i < COUNTOF(table); i++ ){
  13.         table[i] = *(p + i);
  14.         printf("table %u value is %u\r\n", i, table[i]);
  15.      }
  16.      d.srcData = am;
  17.      printf("%u \r\n", d.memData[0]);
  18.      MemToFlash(d.memData, sizeof(d));
  19.      sendData((u8*)d.memData, sizeof(d)); //  <==> sendData((unsigned char*)&am, sizeof(am));
  20. }


  21. //你的代码改一下也是等效的
  22. double a = 1010.001;
  23. unsinged char txdata[sizeof(a)] = {0};

  24. void func(void)
  25. {
  26.         unsigned long  data = 0;
  27.         a=1010.0f;                 //10进制
  28.         data = *((unsigned long*)&a);
  29.         txdata[0] = (data >> 56)  &  0xff;
  30.         txdata[1] = (data >> 48)  &  0xff;
  31.         txdata[2] = (data >> 40)  &  0xff;
  32.         txdata[3] = (data >> 32)  &  0xff;
  33.         txdata[4] = (data >> 24)  &  0xff;
  34.         txdata[5] = (data >> 16)  &  0xff;
  35.         txdata[6] = (data >> 8)   &  0xff;
  36.         txdata[7] = a  & 0xff;       //发送代码
  37. }

复制代码

出0入0汤圆

 楼主| 发表于 2015-1-16 08:59:09 | 显示全部楼层
哎,草草草,我的错,检查出来了,浮点数半路上总是赋值给long型变量,然后又赋值了float变量,所以小数部分总是被抹去了。
另外用下面这个也行:
unsigned long float_to_bits(float x)
{
    unsigned long y;
    memcpy(&y, &x, 4);
    return y;
}

出0入0汤圆

发表于 2015-1-16 09:14:36 | 显示全部楼层
参考一下。
        //Modbus 报文 AE F8 41 55
        unsigned char data[4] = {0xF8, 0xAE, 0x55, 0x41, };
        float* f;
        f = (float*)data;
        printf("报文数值为: %g\n", *f);

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-11 00:02

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

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