收藏官网首页
查看: 2758|回复: 0

[经验分享] 新技能ieee754类型转化成float

36

主题

308

帖子

60

积分

注册会员

Rank: 2

积分
60
发表于 2017-6-21 18:07:12 | 显示全部楼层 |阅读模式
汉枫LPB120模块
IEEE 754 标准是IEEE二进位浮点数算术标准(IEEE Standard for Floating-Point Arithmetic)的标准编号[1] ,等同于国际标准ISO/IEC/IEEE 60559[2] 。该标准由美国电气电子工程师学会(IEEE)计算机学会旗下的微处理器标准委员会(Microprocessor Standards Committee, MSC)发布。这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormal number),一些特殊数值(无穷(Inf)与非数值(NaN)),以及这些数值的「浮点数运算子」;它也指明了四种数值修约规则和五种例外状况(包括例外发生的时机与处理方式 ...废话太多 .................

iieee754类型的数据 一般是用在仪器的读.和精确数值的计算
如何计算呢这才是我们要计算的
一中比较简单的
  1. long int x = 0x3f8ccccd;// 1.1  
  2. float b = *(float*)&x;  
  3. printf("b=%f\n",b);
复制代码
解释:
0x3f8ccccd是浮点数1.1的IEEE754格式,以十六进制显示。&x表示取1.1的地址,得到一个int型指针。(float*)&x表示将&x这个int型指针强制转换成float型指针。*(float*)&x表示这个float型指针所指向的数,也就是1.1。最后b的值显示就是1.1


第二种办法


  1. /*作者:左健     单位:cqccri   时间:2014.12.20*/


  2. #include<iostream>
  3. #include<math.h>
  4. using namespace std;
  5. int a[33],b[33],*pa=a,*pb=b;

  6. //========================================================================================
  7. //Description : 将十进制数据整数部分转换为二进制格式
  8. //Argument(s) : none
  9. //Return(s)   : none
  10. //Caller(s)   :                                                            
  11. //Note(s)     : none
  12. //========================================================================================
  13. void Decimal_Integer_To_Binary(int x)
  14. {
  15.         int m,i;
  16.         for(i=0;;i++)
  17.         {
  18.                 *(pa+i)=x%2;
  19.                 m=x/2;
  20.                 x=m;
  21.                 if(m==0)
  22.                 {
  23.                         *(pa+32)=i;  //此时的i比实际的位数个数少1
  24.                         break;
  25.                 }
  26.         }
  27.         for(int j(0);j<=i;j++)
  28.                 *(pb+j)=*(pa+i-j);
  29. }
  30. //========================================================================================
  31. //Description : 将接收到的四个字节的IEEE754格式数据转换浮点数
  32. //Argument(s) : none
  33. //Return(s)   : 浮点数
  34. //Caller(s)   :                                                            
  35. //Note(s)     : none
  36. //========================================================================================
  37. float IEEE754_To_Float(int* p4x8)
  38. {
  39.         int i=0,j=0,flag=0,Exp_Part=0,exp_part=0;
  40.         int        ieee754_result[33]={0},Decimal_Part[33]={0};
  41.         __int64 Integer_Part[33]={0};
  42.         float back_float=0.0,multi0_5=1.0;
  43.         for (i=0;i<4;i++)
  44.         {
  45.                 Decimal_Integer_To_Binary(*(p4x8+i));
  46.                 flag=a[32];
  47.                 for(j=0;j<=flag;j++)
  48.                         ieee754_result[i*8+(8-flag+j)]=b[j];                                        //ieee754_result[1]~ieee754_result[32]
  49.         }
  50.         for (i=2;i<=9;i++)
  51.         {
  52.                 Exp_Part+=ieee754_result[i]*(1<<(9-i));
  53.         }
  54.         exp_part=Exp_Part-127;                                                                                        //取得指数及移位个数
  55.         if (exp_part>=0)
  56.         {
  57.                 Integer_Part[1]=1;                                                                                        //1~32
  58.                 for (i=0;i<exp_part;i++)
  59.                 {
  60.                         if (i>=23)  break;                                                                                //ieee754_result[]维数不能超过32,Integer_Part[]就不能超过24
  61.                         Integer_Part[i+2]=ieee754_result[i+10];                                        //装入整数部分
  62.                 }
  63.                         Integer_Part[32]=exp_part+1;                                                        //整数部分的个数
  64.                 if(exp_part<23)
  65.                 {
  66.                         for (i=0;i<23-exp_part;i++)
  67.                         {
  68.                                 Decimal_Part[i+1]=ieee754_result[10+exp_part+i];        //1~32,装入小数部分
  69.                         }
  70.                         Decimal_Part[32]=23-exp_part;                                                                //小数部分的个数
  71.                 }
  72.         }
  73.         else
  74.         {
  75.                 exp_part=-exp_part;
  76.                 Integer_Part[32]=0;                                                                                        //整数部分的个数
  77.                 for (i=0;i<exp_part;i++)
  78.                 {
  79.                         Decimal_Part[i+1]=0;                                                                        //1~32,装入小数部分.先全部填0,最后在exp_part处填1替换
  80.                 }
  81.                 Decimal_Part[exp_part]=1;
  82.                 for (i=0;i<23;i++)
  83.                 {
  84.                         Decimal_Part[exp_part+i+1]=ieee754_result[10+i];                //1~32,装入小数部分
  85.                 }
  86.                 Decimal_Part[32]=exp_part+23;                                                                //小数部分的个数               
  87.         }
  88.         for (i=1;i<=Integer_Part[32];i++)                                                                //获得整数部分
  89.         {
  90.                 if(i>24) break;                                                                                                //Integer_Part不能超过24
  91.                 back_float+=Integer_Part[i]*(1<<(Integer_Part[32]-i));
  92.         }
  93.         for (i=1;i<=Decimal_Part[32];i++)                                                                //获得小数部分
  94.         {
  95.                 if(i>24) break;
  96.                 for (j=1;j<=i;j++)
  97.                 {
  98.                         multi0_5*=0.5;
  99.                 }
  100.                 back_float+=Decimal_Part[i]*multi0_5;
  101.                 multi0_5=1.0;
  102.         }
  103.        
  104.         if (1==ieee754_result[1])
  105.         {
  106.                 back_float=-back_float;
  107.         }
  108.         for (i=0;i<33;i++)
  109.         {
  110.                 *(pa+i)=0;
  111.                 *(pb+i)=0;
  112.         }

  113.        
  114.         return back_float;
  115. }
  116. void main()
  117. {
  118.         int input_result[4]={0};
  119.         float result_float=0.0;
  120.         while(1)
  121.         {
  122.                 printf("请输入IEEE754格式的四个字节数(以英文逗号分隔,如:3f,80,00,00):\n");
  123.                 scanf("%x,%x,%x,%x",input_result,input_result+1,input_result+2,input_result+3);
  124.                 result_float=IEEE754_To_Float(input_result);
  125.                 printf("%x,%x,%x,%x的浮点数的结果为:%f\n",*(input_result+0),*(input_result+1),*(input_result+2),*(input_result+3),result_float);
  126. //                printf("%x,%x,%x,%x的浮点数*408-401的结果为:%f\n",*(input_result+0),*(input_result+1),*(input_result+2),*(input_result+3),result_float*408-401);
  127.         }
  128. }

复制代码
相信大家已经知道怎么可以转换了
G3机智云物联网云服务 287087942
有什么疑问,可以在论坛,qq群(优先在论坛哦,避免重复造轮子)
在论坛提问的回答率是100%!!!!!!!!
希望和大家一起交流学习.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2022 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

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