#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define datatype int
#define MAX_SIZE 50
#define OK 1
#define Err 0
/**
* Code : By YangLong 2014年9月21日,
*
* 0x00: 函数说明
* XD2B 将任意一个 浮点数 转换为 2 进制
* XD2B(double f,char* s, bool z)
* 参数一: 需要转换的浮点数
* 参数二: 存放结果的字符数组
* 参数三: z = true 时 代表 整数转换
* z = false 时 表示浮点数 转换
*
* 0x01 IEEE754(char* s)
* 参数一: 将 XD2B中的字符数组 转换为 IEEE754格式
* 0x02 不足:
* 结果显示为 拆分项
* 要链接起来 用 字符串 拼接 就行
*
* 0x03 待优化:
* 结果显示为 16进制
* 将IEEE754转换为真值
*
* 不是程序复杂,而是编写的有点乱。
*/
typedef struct Stack
{
datatype data[MAX_SIZE];
int top;
}stk;
void Init(stk* s)
{
s->top = -1;
}
bool push(stk *s,datatype d)
{
if(s->top+1>MAX_SIZE-1)
{
printf(" 'push' Error: Overflow!\n");
exit(0);
}
s->data[++s->top] = d;
return OK;
}
datatype pop(stk* s)
{
if(s->top<0)
{
printf(" 'pop' Error: Overflow!");
exit(0);
}
datatype data = s->data[s->top--];
return data;
}
bool IsEmpty(stk* s)
{
return s->top == -1 ? OK : Err;
}
void XD2B(double f,char* s, bool z)
{
int i=0,j=0;
stk ss;
Init(&ss);
if(f<0)
{
s[0] = '1';
j = 1;
f = f*(-1.0);
}
else
{
s[0] = '0';
j = 1;
}
int q = (int)f;
while(q)
{
push(&ss,q%2);
q = q/2;
}
while(!IsEmpty(&ss))
{
s[j++] = pop(&ss) + '0';
}
if(z) // z×××运算
return;
s[j++] = '.';
f = f - (int)f;
while(i<23)
{
f = f*2;
s[j+i] = (int)f + '0';
f = f - (int)f;
i++;
}
}
void IEEE754(char* s)
{
int j=1,i = 0,q,e,jm=0;
while(s[++i]!='.');
int m=1;
if(i>1)
{
while(s[m]!='1' && m<strlen(s)) m++;
//printf("\n i = %d m= %d i - m = %d ",i,m,i - m-1); //去掉符号位
jm = i-m-1;
}
else
{
while(s[m]!='1' && m<strlen(s)) m++;
//printf("\n i = %d m= %d i - m = %d ",i,m,i - m); //去掉符号位
jm = i-m;
}
int js = jm;
jm = jm + 127;
char cjm[16] = {0};
char ws[65]={0};
XD2B(jm,cjm,true); //××× 转换
printf("\n符号位: %c",s[0]);
printf("\n阶码: %s\n",&cjm[1]);
for(q= i -js,e=0; q<strlen(s);q++)
{
if(s[q] != '.')
ws[e++] = s[q];
}
printf("尾数: %s",ws);
}
void main()
{
printf("Code By YangLong 0.o\n ");
printf("IEEE754 ->:");
char s[80]={0};
double df=0.0;
scanf("%lf",&df);
XD2B(df,s,false);
printf("%.16lf 二进制小数: ",df);
bool flag =true;
int j = 0;
for(int i=0;i<strlen(s);i++)
{
putchar(s[i]);
if(i == 0)
{
putchar(' '); //符号位
}
else if(i%4 ==0 ) //控制
putchar(' ');
}
IEEE754(s);
printf("\n");
getchar();
getchar();
}
转载于:https://blog.51cto.com/black4yl/1589779