#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(); }