阅读附件材料,了解IEEE 754浮点数表示标准,写程序解析“BD9D”?
#include<iostream>
#include<cstring>
#include<stdio.h>
#include<cstdlib>
int a[33];
unsigned int y,x;
using namespace std;
void init()
{
if(x<=0xF)
y=4;
else if(x<=0xFF)
y=8;
else if(x<=0xFFF)
y=12;
else if(x<=0xFFFF)
y=16;
else if(x<=0xFFFFF)
y=20;
else if(x<=0xFFFFFF)
y=24;
else if(x<=0xFFFFFFF)
y=28;
else
y=32;
}
int main()
{
int sum=0;
double t1,sum1;
int m;
unsigned int temp,t;
while(scanf("%x",&x))
{
t1=1,sum1=0;sum=0;
init();
int i,j;
memset(a,0,sizeof(a));
for(i=0;i<y;i++)
{
temp=x;
temp=temp>>i;
a[32-i]=temp&1;
}
/*
输出二进制位数
*/
for(i=1;i<=32;i++)
cout<<a[i];
cout<<endl;
}
return 0;
}
/*
input:
BD9D
output:
00000000000000001011110110011101
*/
目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。下面是具体的规格:
符号位阶码 尾数长度
float 18 23 32
double 1 11 52 64
首先看下这个例子:
(逆向求十进制整数)一个浮点二进制数手工转换成十进制数的例子: 假设浮点二进制数是 1011 1101 0100 0000 0000 0000 0000 0000 按1,8,23位分成三段:
101111010 10000000000000000000000 最后一段是尾数。前面加上"1.", 就是 1.10000000000000000000000 下面确定小数点位置。由E = e-Bias,阶码E是01111010,加上00000101才是01111111(127), 所以他减去127的偏移量得e=-5。(或者化成十进制得122,122-127=-5)。 因此尾数1.10(后面的0不写了)是小数点右移5位的结果。要复原它就要左移5位小数点,得0.0000110, 即十进制的0.046875 。最后是符号:1代表负数,所以最后的结果是 -0.046875 。注意:其他机器的浮点数表示方法可能与此不同. 不能任意移植。
#include<iostream>
#include<cstring>
#include<stdio.h>
#include<cstdlib>
int a[33];
unsigned int y,x;
using namespace std;
void init()
{
if(x<=0xF)
y=4;
else if(x<=0xFF)
y=8;
else if(x<=0xFFF)
y=12;
else if(x<=0xFFFF)
y=16;
else if(x<=0xFFFFF)
y=20;
else if(x<=0xFFFFFF)
y=24;
else if(x<=0xFFFFFFF)
y=28;
else
y=32;
}
int main()
{
int sum=0;
double t1,sum1;
int m;
unsigned int temp,t;
while(scanf("%x",&x))
{
t1=1,sum1=0;sum=0;
init();
int i,j;
memset(a,0,sizeof(a));
for(i=0;i<y;i++)
{
temp=x;
temp=temp>>i;
a[32-i]=temp&1;
}
/*
输出二进制位数
*/
for(i=1;i<=32;i++)
cout<<a[i];
cout<<endl;
for(i=9;i>=2;i--)
{
t=1;
for(j=0;j<9-i;j++)
t*=2;
sum+=t*a[i];
}
m=sum-127;//移动的位数
//cout<<m<<endl;
//if(m>0)
a[9]=1;
if(m<=0)
{
t=-m;
t1=1;
for(i=1;i<=t;i++)
{
t1*=0.5;
}
for(i=9;i<=32;i++)
{
for(j=9;j<i;j++)
{
t1*=0.5;
}
sum1+=a[i]*t1;
}
}
else if(m>0)
{
for(i=9+m;i>=9;i--)
{
t=1;
for(j=0;j<9+m-i;j++)
t*=2;
sum1+=t*a[i];
}
for(i=10+m;i<=32;i++)
{
t1=1;
for(j=10+m;j<=i;j++)
t1*=0.5;
sum1+=t1*a[i];
}
}
if(a[1]==1)sum1=-sum1;
cout<<sum1<<endl;
}
return 0;
}
/*
BD400000
10111101010000000000000000000000
-0.046875
BD9DE0CB
10111101100111011110000011001011
-0.0635395
3C181F9A
00111100000110000001111110011010
0.0079422
BD4EAAED
10111101010011101010101011101101
-0.0469065
3F0690F8
00111111000001101001000011111000
0.500015
3F598C56
00111111010110011000110001010110
0.758301
*/