如何在没有外部库的任何 lua 中将 double 转换为小字符串表示而不丢失数据?
How to convert a double to a small string representation without data loss in any lua without external libs?
我想仅使用任何 Lua 版本将数字转换为字符串,以便
没有数据丢失(必要!)
- 字符串表示尽可能小(8 个字节就可以)(可选,不是必需的)
没有使用外部库(必需!)
- 转换尽可能快(可选,不是必需的)
我不关心
- 人类可读性
- 避免使用特殊字符
我尝试了内置的 tonumber
函数,但它并不总是给出正确的结果:
> print((2+256^6)==(1+256^6))
false
> print(tostring(2+256^6)==tostring(1+256^6))
true
这包括一个 number_to_str 和一个 number_from_str 函数:
https://github.com/bakpakin/binser/blob/master/binser.lua
显然,它们的能力超过 Lua 的内置数字...
如果您可以使用标准 Lua 库,试试这些:
x=math.pi
s=string.pack("d",x)
y=string.unpack("d",s)
print(x==y)
s=string.format("%a",x)
y=tonumber(s)
print(x==y)
string.format("%a",x)
在 Lua 5.2+ 中可用。 string.pack
在 Lua 5.3+ 中可用。
-- Encoding/decoding without data loss
local NaN_serialized = {
[string.format('%.17g', 1/0 )] = '1/0',
[string.format('%.17g', -1/0 )] = '-1/0',
[string.format('%.17g', 0/0 )] = '0/0',
[string.format('%.17g', -(0/0))] = '-(0/0)'
}
-- How to encode:
str_value = string.format('%.17g', num_value):gsub('^.*', NaN_serialized):gsub(',', '.')
-- How_to_decode:
num_value = loadstring("return "..str_value)()
我想仅使用任何 Lua 版本将数字转换为字符串,以便
没有数据丢失(必要!)
- 字符串表示尽可能小(8 个字节就可以)(可选,不是必需的)
没有使用外部库(必需!)
- 转换尽可能快(可选,不是必需的)
我不关心
- 人类可读性
- 避免使用特殊字符
我尝试了内置的 tonumber
函数,但它并不总是给出正确的结果:
> print((2+256^6)==(1+256^6))
false
> print(tostring(2+256^6)==tostring(1+256^6))
true
这包括一个 number_to_str 和一个 number_from_str 函数:
https://github.com/bakpakin/binser/blob/master/binser.lua
显然,它们的能力超过 Lua 的内置数字...
如果您可以使用标准 Lua 库,试试这些:
x=math.pi
s=string.pack("d",x)
y=string.unpack("d",s)
print(x==y)
s=string.format("%a",x)
y=tonumber(s)
print(x==y)
string.format("%a",x)
在 Lua 5.2+ 中可用。 string.pack
在 Lua 5.3+ 中可用。
-- Encoding/decoding without data loss
local NaN_serialized = {
[string.format('%.17g', 1/0 )] = '1/0',
[string.format('%.17g', -1/0 )] = '-1/0',
[string.format('%.17g', 0/0 )] = '0/0',
[string.format('%.17g', -(0/0))] = '-(0/0)'
}
-- How to encode:
str_value = string.format('%.17g', num_value):gsub('^.*', NaN_serialized):gsub(',', '.')
-- How_to_decode:
num_value = loadstring("return "..str_value)()