Lua 实现三字节浮点数转换函数 - sf_math_tranFloat
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 函数接受两个参数:
Integer: 整数部分Fraction: 小数部分(已经被放大 65536 倍,也就是左移 16 位)
函数将这两个参数转换为一个三字节或两字节的浮点数,并返回一个包含两个属性 exponent 和 mantissa 的表,分别表示浮点数的指数和尾数。
代码解读
-
首先,判断
Integer和Fraction是否都为 0,如果是,则直接返回一个特殊的值,表示 0。 -
接着,找到
Integer中最高位的 1 的位置,并将其记录在BitPos_HighSet中。 -
根据
BitPos_HighSet的值,对Integer进行移位操作,并计算u16Mantissa和u8Exponent。 -
最后,根据
FltType的值,对retri.mantissa进行调整,以生成最终的三字节或两字节浮点数。
convertToDecimal 函数
convertToDecimal 函数接受三个参数:
sign: 符号位,0 代表正数,1 代表负数exponent_bias: 指数偏移量,一般为 127fraction: 尾数
该函数将三字节浮点数转换为十进制数,并返回转换结果。
总结
本文介绍了使用 Lua 语言实现的三字节浮点数转换函数 sf_math_tranFloat,该函数可以将整型整数和小数部分转换为三字节或两字节的浮点数格式。代码详细说明了函数的逻辑和步骤,并提供了 convertToDecimal 函数将三字节浮点数转换为十进制数。
希望本文能帮助您理解 Lua 中的三字节浮点数转换原理和实现方式。如果您有任何疑问,请随时在评论区留言。
原文地址: https://www.cveoy.top/t/topic/f3Oc 著作权归作者所有。请勿转载和采集!