将整数和小数转换为三字节或两字节浮点数的 Lua 函数
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
原文地址: https://www.cveoy.top/t/topic/f3Of 著作权归作者所有。请勿转载和采集!