1. 程式人生 > 其它 >float轉IEEE 754 32位浮點數

float轉IEEE 754 32位浮點數

以參考連結的內容為主,加入少量處理

#include <iostream>
#include <stdio.h>

//整數轉r進位制
//integer:整數 radix:進位制 result:結果陣列 num:生成r進位制所佔位數
void D1toB(int integer, int radix, int result[], int& num)
{
    int i, j, n;
    for (i = 0; integer > 0; i++)//除r取餘
    {
        result[i] = integer % radix;
        integer = integer / radix;
    }
    num = i;//r進位制位數
    for (j = 0; j < i / 2; j++)//顛倒順序 
    {
        n = result[j];
        result[j] = result[i - 1 - j];
        result[i - 1 - j] = n;
    }
}

//小數轉r進位制
//decimal:小數 radix:進位制 result:結果陣列 num:生成r進位制所佔位數
void D2toB(double decimal, int radix, int result[], int& num)
{
    int i;
    for (i = 0; decimal > 0 && i < 50; i++)//乘r取整
    {
        result[i] = decimal * radix;
        decimal = decimal * radix;
        decimal = decimal - int(decimal);
    }
    num = i;
}

int main()
{
    int integer;//整數部分 
    double decimal;//小數部分 
    int s, p[8], m[50];//浮點數符號位,階碼數,尾數 

    while (true)
    {
        double number;//輸入的浮點數 
        printf("請輸入一個浮點數:");
        scanf_s("%lf", &number);
        getchar(); //取走回車符

        int i, j;
        for (i = 0; i < 8; i++)//清零
        {
            p[i] = 0;
        }
        for (i = 0; i < 50; i++)
        {
            m[i] = 0;
        }

        //確定符號位 
        if (number > 0)
        {
            s = 0;
        }
        else
        {
            s = 1;
            number = -number;
        }
        //將浮點數分成整數和小數 
        integer = (int)number;
        decimal = number - integer;
        //分別將整數和小數轉化成二進位制 
        int m_n1, m_n2;
        D1toB(integer, 2, m, m_n1);
        D2toB(decimal, 2, m + m_n1, m_n2);
        //規格化,計算階數, 尾數
        int pn = 0;//階數 

        if (integer > 0)//小數點左移
        {
            pn = m_n1 - 1;//階數 
            for (i = 0; i < 23; i++)//去掉首位預設的1
            {
                m[i] = m[i + 1];
            }
        }
        else//小數點右移
        {
            for (i = 0; m[i] == 0; i++)
            {
            }
            pn = -i - 1;
            for (j = 0; j < 23; j++)//去掉左邊無效的0和第一個的1
            {
                m[j] = m[j + 1 + i];
            }
        }
        //計算階碼
        int p1[8], pn1;
        D1toB(pn + 127, 2, p1, pn1);//階數轉二進位制 
        if (pn1 < 8)//不足8位左邊補0 
        {
            for (j = 0; j < 8 - pn1; j++)
            {
                p[j] = 0;
            }
            for (int k = 0; k < pn1; k++)//得出完整p 
            {
                p[j + k] = p1[k];
            }
        }
        else
        {
            for (i = 0; i < 8; i++)//得出完整p 
            {
                p[i] = p1[i];
            }
        }

        //輸出s
        printf("%d", s);
        //輸出p
        for (i = 0; i < 8; i++)
        {
            printf("%d", p[i]);
        }
        printf(" "); //輸出s
        //輸出m
        for (i = 0; i < 23; i++)
        {
            printf("%d", m[i]);
        }
        printf("\n\n");

        int array1[32];
        memset(array1,0,32);
        array1[0] = s;
        memcpy(array1 + 1,p,8*sizeof(int));
        memcpy(array1 + 9, m, 22*sizeof(int));
        for (i = 0; i < 32; i++)
        {
            printf("%d", array1[i]);
        }
        printf("\n\n");
        int res[8];
        int k = 0;
        for (i = 0; i < 32; i+=4)
        {
            res[k]=array1[i]*8 + array1[i+1]*4 + array1[i+2]*2 + array1[i+3];
            k++;
        }
        for (i = 0; i < k; i++)
        {
            printf("%x", res[i]);
        }
        printf("\n\n");
    }
    return 0;

}

輸出結果

參考:
C語言:IEEE754十進位制數轉二進位制單精度浮點數