将一个 64 位浮点数转换为两个整数 < 2^32,然后在 Lua 5.1 中进行反转

我想将一个数字(64 位双精度)转换为两个整数(无符号32位)并返回。是否可能在不损失精度的情况下完成此操作?64位数字应适合两个32位数字,我只是无法想出如何在Lua中完成它。

我尝试使用LuaJIT中的bitop库进行实验,但结果没有什么用处。是否可以将数字强制转换为“unsigned long long”,并在纯Lua代码中使用ffi API将其拆分?

也许没有损失精度是不可能的。即使我失去精度,什么是合理的方法呢?

点赞
用户1847592
用户1847592

使用 LuaJIT:

local ffi = require"ffi"
local u = ffi.new"union{uint32_t i[2]; double d;}"
-- 将双精度数转换为一对 int32
u.d = 1/3
print(("%x %x"):format(u.i[0], u.i[1]))  --> 55555555 3fd55555
2017-11-14 22:22:24
用户107090
用户107090

你可以使用 math.frexp 提取双精度浮点数 IEEE 754 表示的字节,使用 math.ldexp 从字节重建数字。

参见 packers.doubleunpack_double

也可以尝试更简单的代码,参见 http://lua-users.org/lists/lua-l/2015-03/msg00159.html

2017-11-15 11:59:11