|
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类型的数据 一般是用在仪器的读.和精确数值的计算
如何计算呢这才是我们要计算的
一中比较简单的
- long int x = 0x3f8ccccd;// 1.1
- float b = *(float*)&x;
- 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
第二种办法
- /*作者:左健 单位:cqccri 时间:2014.12.20*/
- #include<iostream>
- #include<math.h>
- using namespace std;
- int a[33],b[33],*pa=a,*pb=b;
- //========================================================================================
- //Description : 将十进制数据整数部分转换为二进制格式
- //Argument(s) : none
- //Return(s) : none
- //Caller(s) :
- //Note(s) : none
- //========================================================================================
- void Decimal_Integer_To_Binary(int x)
- {
- int m,i;
- for(i=0;;i++)
- {
- *(pa+i)=x%2;
- m=x/2;
- x=m;
- if(m==0)
- {
- *(pa+32)=i; //此时的i比实际的位数个数少1
- break;
- }
- }
- for(int j(0);j<=i;j++)
- *(pb+j)=*(pa+i-j);
- }
- //========================================================================================
- //Description : 将接收到的四个字节的IEEE754格式数据转换浮点数
- //Argument(s) : none
- //Return(s) : 浮点数
- //Caller(s) :
- //Note(s) : none
- //========================================================================================
- float IEEE754_To_Float(int* p4x8)
- {
- int i=0,j=0,flag=0,Exp_Part=0,exp_part=0;
- int ieee754_result[33]={0},Decimal_Part[33]={0};
- __int64 Integer_Part[33]={0};
- float back_float=0.0,multi0_5=1.0;
- for (i=0;i<4;i++)
- {
- Decimal_Integer_To_Binary(*(p4x8+i));
- flag=a[32];
- for(j=0;j<=flag;j++)
- ieee754_result[i*8+(8-flag+j)]=b[j]; //ieee754_result[1]~ieee754_result[32]
- }
- for (i=2;i<=9;i++)
- {
- Exp_Part+=ieee754_result[i]*(1<<(9-i));
- }
- exp_part=Exp_Part-127; //取得指数及移位个数
- if (exp_part>=0)
- {
- Integer_Part[1]=1; //1~32
- for (i=0;i<exp_part;i++)
- {
- if (i>=23) break; //ieee754_result[]维数不能超过32,Integer_Part[]就不能超过24
- Integer_Part[i+2]=ieee754_result[i+10]; //装入整数部分
- }
- Integer_Part[32]=exp_part+1; //整数部分的个数
- if(exp_part<23)
- {
- for (i=0;i<23-exp_part;i++)
- {
- Decimal_Part[i+1]=ieee754_result[10+exp_part+i]; //1~32,装入小数部分
- }
- Decimal_Part[32]=23-exp_part; //小数部分的个数
- }
- }
- else
- {
- exp_part=-exp_part;
- Integer_Part[32]=0; //整数部分的个数
- for (i=0;i<exp_part;i++)
- {
- Decimal_Part[i+1]=0; //1~32,装入小数部分.先全部填0,最后在exp_part处填1替换
- }
- Decimal_Part[exp_part]=1;
- for (i=0;i<23;i++)
- {
- Decimal_Part[exp_part+i+1]=ieee754_result[10+i]; //1~32,装入小数部分
- }
- Decimal_Part[32]=exp_part+23; //小数部分的个数
- }
- for (i=1;i<=Integer_Part[32];i++) //获得整数部分
- {
- if(i>24) break; //Integer_Part不能超过24
- back_float+=Integer_Part[i]*(1<<(Integer_Part[32]-i));
- }
- for (i=1;i<=Decimal_Part[32];i++) //获得小数部分
- {
- if(i>24) break;
- for (j=1;j<=i;j++)
- {
- multi0_5*=0.5;
- }
- back_float+=Decimal_Part[i]*multi0_5;
- multi0_5=1.0;
- }
-
- if (1==ieee754_result[1])
- {
- back_float=-back_float;
- }
- for (i=0;i<33;i++)
- {
- *(pa+i)=0;
- *(pb+i)=0;
- }
-
- return back_float;
- }
- void main()
- {
- int input_result[4]={0};
- float result_float=0.0;
- while(1)
- {
- printf("请输入IEEE754格式的四个字节数(以英文逗号分隔,如:3f,80,00,00):\n");
- scanf("%x,%x,%x,%x",input_result,input_result+1,input_result+2,input_result+3);
- result_float=IEEE754_To_Float(input_result);
- printf("%x,%x,%x,%x的浮点数的结果为:%f\n",*(input_result+0),*(input_result+1),*(input_result+2),*(input_result+3),result_float);
- // 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);
- }
- }
复制代码 相信大家已经知道怎么可以转换了
|
|