gpt4 book ai didi

floating-point - Lua-包装IEEE754单精度 float

转载 作者:行者123 更新时间:2023-12-04 03:52:54 26 4
gpt4 key购买 nike

我想在纯Lua中创建一个函数,该函数从一个数字生成分数(23位),一个指数(8位)和一个符号(1位),因此该数字大约等于math.ldexp(fraction, exponent - 127) * (sign == 1 and -1 or 1),然后将生成的值打包为32位。
数学库中的某个函数引起了我的注意:

The frexp function breaks down the floating-point value (v) into a mantissa (m) and an exponent (n), such that the absolute value of m is greater than or equal to 0.5 and less than 1.0, and v = m * 2^n.

Note that math.ldexp is the inverse operation.


但是,我想不出任何适当包装非整数数字的方法。由于此函数返回的尾数不是整数,因此我不确定是否可以使用它。
有什么有效的方法可以执行类似于 math.frexp()的操作,该操作返回一个整数作为尾数?还是有更好的方法在Lua中以IEEE754单精度浮点格式打包数字?
先感谢您。
编辑
我特此介绍(希望的)函数的最终版本:
function PackIEEE754(number)
if number == 0 then
return string.char(0x00, 0x00, 0x00, 0x00)
elseif number ~= number then
return string.char(0xFF, 0xFF, 0xFF, 0xFF)
else
local sign = 0x00
if number < 0 then
sign = 0x80
number = -number
end
local mantissa, exponent = math.frexp(number)
exponent = exponent + 0x7F
if exponent <= 0 then
mantissa = math.ldexp(mantissa, exponent - 1)
exponent = 0
elseif exponent > 0 then
if exponent >= 0xFF then
return string.char(sign + 0x7F, 0x80, 0x00, 0x00)
elseif exponent == 1 then
exponent = 0
else
mantissa = mantissa * 2 - 1
exponent = exponent - 1
end
end
mantissa = math.floor(math.ldexp(mantissa, 23) + 0.5)
return string.char(
sign + math.floor(exponent / 2),
(exponent % 2) * 0x80 + math.floor(mantissa / 0x10000),
math.floor(mantissa / 0x100) % 0x100,
mantissa % 0x100)
end
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)
if exponent == 0xFF then
if mantissa > 0 then
return 0 / 0
else
mantissa = math.huge
exponent = 0x7F
end
elseif exponent > 0 then
mantissa = mantissa + 1
else
exponent = exponent + 1
end
if b1 >= 0x80 then
mantissa = -mantissa
end
return math.ldexp(mantissa, exponent - 0x7F)
end
我改进了利用隐式位的方式,并为诸如NaN和infinity之类的特殊值添加了适当的支持。我基于链接到catwell的脚本的格式。
我感谢你们俩的宝贵建议。

最佳答案

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

关于floating-point - Lua-包装IEEE754单精度 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14416734/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com