float轉IEEE 754 32位浮點數(環境:VS 、STM32)


1.使用VS進行驗證

//編程環境:
//操作系統:windows 10
//編程工具:VS2021
//編程語言:c/c++語言

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

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

    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");
}
int main()
{
    while (true)
    {
        float number;//輸入的浮點數 
        printf("請輸入一個浮點數:");
        scanf_s("%f", &number);
        printf("%d",sizeof(number));
        getchar(); //取走回車符
        float_to_IEEE754(number);
    }
    return 0;
}

輸出結果

輸出結果

2.用於STM32F103單片機HAL庫

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

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

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

    int i, j;
    memset(p, 0, 8 * sizeof(int));
    memset(m, 0, 50 * sizeof(int));

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

    uint8_t array32[32];
    memset(array32, 0, 32);

    array32[0] = (uint8_t)s;

    for (i = 0; i < 8; i++)
    {
        array32[i + 1] = (uint8_t)p[i];
    }
    for (i = 0; i < 22; i++)
    {
        array32[i + 9] = (uint8_t)m[i];
    }

    //HAL_UART_Transmit(&huart1, array32, sizeof(array32),100);

    uint8_t array[7];
    memset(array, 0, 7);
    array[0] = 0xAA;
    array[1] = 0xBB;
    array[2] = 0x04; //數據長度
    int k = 3;
    for (i = 0; i < 32; i += 8)
    {
        array[k] &= 0x0f;
        array[k] |= (array32[i] * 8 + array32[i + 1] * 4 + array32[i + 2] * 2 + array32[i + 3]) << 4;
        array[k] &= 0xf0;
        array[k] |= (array32[i + 4] * 8 + array32[i + 5] * 4 + array32[i + 6] * 2 + array32[i + 7]);
        k++;
    }

    HAL_UART_Transmit(&huart1, array, sizeof(array), 100);
}

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM