將十進制數轉換爲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();

}

wKiom1SNL5nB4Kd_AAEKEkfDx7Y190.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章