Lua 实现三字节浮点数转换函数 - sf_math_tranFloat

本文将介绍使用 Lua 语言实现的 sf_math_tranFloat 函数,该函数将整型整数和小数部分转换为三字节或两字节浮点数格式。

function sf_math_tranFloat(Integer, Fraction)
    local retri = {}
    local FltType = 3
    local SignBit = 0
    local u16Mantissa
    local u8Exponent
    local BitPos_HighSet
    local u32IntegerTemp
    local u32Temp
    
    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 bit32.band(u32IntegerTemp, 0x80000000) == 0 do
            u32IntegerTemp = bit32.lshift(u32IntegerTemp, 1)
            BitPos_HighSet = BitPos_HighSet + 1
        end
        BitPos_HighSet = 32 - BitPos_HighSet
    end
    
    if BitPos_HighSet > 16 then
        u16Mantissa = bit32.rshift(u32IntegerTemp, 16)
        u8Exponent = BitPos_HighSet - 16
        u8Exponent = u8Exponent + 16
    elseif BitPos_HighSet == 16 then
        u16Mantissa = bit32.rshift(u32IntegerTemp, 16)
        u8Exponent = 16
    else
        u32Temp = Integer
        u32Temp = bit32.bor(bit32.lshift(u32Temp, 16), Fraction)
        
        BitPos_HighSet = 0
        while bit32.band(u32Temp, 0x80000000) == 0 do
            u32Temp = bit32.lshift(u32Temp, 1)
            BitPos_HighSet = BitPos_HighSet + 1
        end
        u16Mantissa = bit32.rshift(u32Temp, 16)
        u8Exponent = BitPos_HighSet
        
        if u8Exponent <= 16 then
            u8Exponent = 16 - u8Exponent
        else
            u8Exponent = u8Exponent - 16
            u8Exponent = 128 - u8Exponent
        end
    end
    
    if SignBit == 1 then
        u8Exponent = bit32.bor(u8Exponent, 0x80)
    end
    
    retri.exponent = u8Exponent
    retri.mantissa = u16Mantissa
    
    if FltType == 2 then
        if bit32.band(retri.mantissa, 0x0080) ~= 0 then
            retri.mantissa = bit32.rshift(retri.mantissa, 8)
            retri.mantissa = retri.mantissa + 1
        else
            retri.mantissa = bit32.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 + bit32.band(bit32.rshift(fraction, 22 - i), 1) / (2 ^ (i + 1))
    end
    
    if sign == 1 then
        decimal = -decimal
    end
    
    for i = 0, exponent - 1 do
        decimal = decimal * 2
    end
    
    return decimal
end

函数功能

sf_math_tranFloat 函数接受两个参数:

  1. Integer: 整数部分
  2. Fraction: 小数部分(已经被放大 65536 倍,也就是左移 16 位)

函数将这两个参数转换为一个三字节或两字节的浮点数,并返回一个包含两个属性 exponentmantissa 的表,分别表示浮点数的指数和尾数。

代码解读

  1. 首先,判断 IntegerFraction 是否都为 0,如果是,则直接返回一个特殊的值,表示 0。

  2. 接着,找到 Integer 中最高位的 1 的位置,并将其记录在 BitPos_HighSet 中。

  3. 根据 BitPos_HighSet 的值,对 Integer 进行移位操作,并计算 u16Mantissau8Exponent

  4. 最后,根据 FltType 的值,对 retri.mantissa 进行调整,以生成最终的三字节或两字节浮点数。

convertToDecimal 函数

convertToDecimal 函数接受三个参数:

  1. sign: 符号位,0 代表正数,1 代表负数
  2. exponent_bias: 指数偏移量,一般为 127
  3. fraction: 尾数

该函数将三字节浮点数转换为十进制数,并返回转换结果。

总结

本文介绍了使用 Lua 语言实现的三字节浮点数转换函数 sf_math_tranFloat,该函数可以将整型整数和小数部分转换为三字节或两字节的浮点数格式。代码详细说明了函数的逻辑和步骤,并提供了 convertToDecimal 函数将三字节浮点数转换为十进制数。

希望本文能帮助您理解 Lua 中的三字节浮点数转换原理和实现方式。如果您有任何疑问,请随时在评论区留言。

Lua 实现三字节浮点数转换函数 - sf_math_tranFloat

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

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