标签:ieee754
#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(); }
标签:ieee754
原文地址:http://black4yl.blog.51cto.com/4222963/1589779