Lua - 打包 IEEE754 单精度浮点数

我想在纯Lua中创建一个函数,该函数从数字中生成一个分数(23位),一个指数(8位)和一个符号(1位),以便该数字大约等于 math.ldexp(fraction,exponent - 127)*(sign == 1 and -1 or 1),然后将生成的值打包到32位中。

我注意到数学库中某个函数:

frexp函数将浮点值(v)分解为一个尾数(m)和一个指数(n),使m的绝对值大于等于0.5且小于1.0,v = m * 2 ^ n。

注意,math.ldexp是反向操作。

但是,我想不出任何有效的方法来正确地打包非整数数字。由于这个函数返回的尾数不是整数,我不确定是否可以使用它。

是否有任何有效的方法类似于 math.frexp() 返回整数作为尾数?或者,在Lua中可能有更好的方法将数字打包为IEEE754单精度浮点格式吗?

提前致谢。

编辑

现在我呈现出我制作的函数(希望是最终版本):

function PackIEEE754(number)
    如果数字== 0 then
        返回string.char0x000x000x000x00)
    elseif number!=数字 then
        返回string.char0xFF0xFF0xFF0xFF)
    别的
        local sign = 0x00
        如果数字<0则
            sign = 0x80
            数字=-数字
        结束
        小数,指数=math.frexp(数字)
        指数=指数+0x7F
        如果指数<=0则
            小数=math.ldexp(小数,指数-1)
            指数=0
        否则如果指数>0则
            如果指数>=0xFF然后
                返回string.char(sign + 0x7F0x800x000x00)
            elseif exponent == 1 then
                指数=0
            别的
                小数=小数* 2-1
                指数=指数-1
            结束
        结束
        小数=math.floor(math.ldexp(小数,23)+0.5)
        返回string.char(
                符号+ math.floor(指数/ 2),
                (指数%2)* 0x80 + math.floor(小数/ 0x10000),
                math.floor(小数/ 0x100)%0x100,
                小数%0x100)
    结束
end
function UnpackIEEE754(packed)
    local b1,b2,b3,b4 =string.byte(packed,1,4)
    local exponent =(b1%0x80)* 0x02 + math.floor(b2/ 0x80)
    local mantissa = math.ldexp(((b2%0x80)* 0x100 + b3)* 0x100 + b4,-23)
    如果指数==0xFF然后
        如果小数> 0然后
            返回0 / 0
        别的
            小数=math.huge
            exponent = 0x7F
        结束
    elseif指数> 0则
        小数=小数+1
    别的
        exponent =指数+1
    结束
    如果b1> = 0x80则
        小数=-小数
    结束
    返回math.ldexp(小数,指数-0x7F)
end

我改进了利用隐式位的方式,并添加了有关特殊值(如NaN和infinity)的适当支持。我基于catwell链接的脚本格式化。

感谢你们的建议。

点赞
用户142434
用户142434

将从 math.frexp() 获得的有效数字乘以2^24,并减去24以进行补偿。现在,有效数字是一个整数。请注意,有效数字是24位,而不是23位(您需要考虑IEEE-754编码中的隐含位)。

2013-01-19 17:14:26
用户204011
用户204011

你看过这篇文章吗?

我认为它以一种稍微简单的方式实现了你想要的功能。

2013-01-21 09:48:14