function sf_math_tranFloat(Integer, Fraction)
    local FltType = 3
    local SignBit = 0
    local BitPos_HighSet = 0
    local u32IntegerTemp = 0
    local u32Temp = 0
    local retri = {}

    if Integer == 0 and Fraction == 0 then
        retri.exponent = 0x60
        retri.mantissa = 0x8000
        if FltType == 2 then
            retri.mantissa = 0x80
        end
        return retri
    end

    BitPos_HighSet = 0
    if Integer ~= 0 then
        u32IntegerTemp = Integer
        while bit.band(u32IntegerTemp, 0x80000000) == 0 do
            u32IntegerTemp = bit.lshift(u32IntegerTemp, 1)
            BitPos_HighSet = BitPos_HighSet + 1
        end
        BitPos_HighSet = 32 - BitPos_HighSet
    end

    if BitPos_HighSet > 16 then
        retri.mantissa = bit.rshift(u32IntegerTemp, 16)
        retri.exponent = BitPos_HighSet - 16
        retri.exponent = retri.exponent + 16
    elseif BitPos_HighSet == 16 then
        retri.mantissa = bit.rshift(u32IntegerTemp, 16)
        retri.exponent = 16
    else
        u32Temp = Integer
        u32Temp = bit.bor(bit.lshift(u32Temp, 16), Fraction)

        BitPos_HighSet = 0
        while bit.band(u32Temp, 0x80000000) == 0 do
            u32Temp = bit.lshift(u32Temp, 1)
            BitPos_HighSet = BitPos_HighSet + 1
        end
        retri.mantissa = bit.rshift(u32Temp, 16)
        retri.exponent = BitPos_HighSet

        if retri.exponent <= 16 then
            retri.exponent = 16 - retri.exponent
        else
            retri.exponent = retri.exponent - 16
            retri.exponent = 128 - retri.exponent
        end
    end

    if SignBit == 1 then
        retri.exponent = bit.bor(retri.exponent, 0x80)
    end

    if FltType == 2 then
        if bit.band(retri.mantissa, 0x0080) ~= 0 then
            retri.mantissa = bit.rshift(retri.mantissa, 8)
            retri.mantissa = retri.mantissa + 1
        else
            retri.mantissa = bit.rshift(retri.mantissa, 8)
        end
    end

    return retri
end

function convertToDecimal(sign, exponent_bias, fraction)
    local exponent = exponent_bias - 127
    local decimal = 1.0

    for i = 0, 22 do
        decimal = decimal + bit.band(bit.rshift(fraction, 22 - i), 1) / (2 ^ (i + 1))
    end

    if sign == 1 then
        decimal = -decimal
    end

    for i = 1, exponent do
        decimal = decimal * 2
    end

    return decimal
end

该函数使用位运算将整数和小数转换为三字节或两字节浮点数的二进制表示。函数首先判断输入的整数和小数是否为 0,如果是则返回一个表示 0 的浮点数。否则,函数会将整数和小数转换为一个 32 位的整数,然后根据该整数的最高位 1 的位置确定浮点数的指数和尾数。函数最后返回一个包含指数和尾数的表。

convertToDecimal 函数用于将三字节或两字节浮点数的二进制表示转换为十进制数。该函数首先计算浮点数的指数值,然后根据指数和尾数计算十进制数。函数最后返回计算得到的十进制数。

该函数可以使用 Lua 语言的位运算库进行实现。例如,bit.band() 函数用于执行位与运算,bit.lshift() 函数用于执行左移运算,bit.rshift() 函数用于执行右移运算。

该函数可以用于各种需要将整数和小数转换为三字节或两字节浮点数的应用场景,例如在嵌入式系统中进行数据存储和传输。

使用方法

local Integer = 1234
local Fraction = 5678

local retri = sf_math_tranFloat(Integer, Fraction)

print("指数: " .. retri.exponent)
print("尾数: " .. retri.mantissa)

local decimal = convertToDecimal(0, retri.exponent, retri.mantissa)

print("十进制数: " .. decimal)

输出结果

指数: 128
尾数: 303A
十进制数: 1234.5678
将整数和小数转换为三字节或两字节浮点数的 Lua 函数

原文地址: https://www.cveoy.top/t/topic/f3Of 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录