Serialization 在没有外部LIB的任何lua中,如何将双精度表示转换为小字符串表示而不丢失数据?
我想只使用任何Lua版本将数字转换为字符串,以便Serialization 在没有外部LIB的任何lua中,如何将双精度表示转换为小字符串表示而不丢失数据?,serialization,lua,numbers,tostring,number-formatting,Serialization,Lua,Numbers,Tostring,Number Formatting,我想只使用任何Lua版本将数字转换为字符串,以便 没有数据丢失(必要!) 字符串表示形式尽可能小(8字节就可以了)(可选,无需) 不使用外部LIB(必要!) 转换速度尽可能快(可选,无需) 我不在乎 人类可读性 避免特殊字符 我尝试了内置的tonumber函数,但它并不总是给出正确的结果: > print((2+256^6)==(1+256^6)) false > print(tostring(2+256^6)==tostring(1+256^6)) true 这包括一个数
- 没有数据丢失(必要!)
- 字符串表示形式尽可能小(8字节就可以了)(可选,无需)
- 不使用外部LIB(必要!)
- 转换速度尽可能快(可选,无需)
- 人类可读性
- 避免特殊字符
tonumber
函数,但它并不总是给出正确的结果:
> print((2+256^6)==(1+256^6))
false
> print(tostring(2+256^6)==tostring(1+256^6))
true
这包括一个数字\u至\u str和一个数字\u自\u str函数:
显然,它们比Lua的内置tonumber功能更强…如果可以使用标准Lua LIB,请尝试以下方法:
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)
在Lua5.2+中提供string.pack
在Lua 5.3+中可用。浮点数的定义是有损的-如果你真的需要避免任何数据丢失,你不能使用浮点数开始。Lua有一个数字数据类型-这些数字是双倍的-我希望能够序列化它们,以便能够序列化除userdata和threads之外的任何数据…有人能发布一个完整的解决方案吗?所以不是一个提供完整解决方案的地方。你从哪里得到的?我看到许多像我这样的小问题的完整解决方案!我不认为将数字序列化是一门大科学。此外,如果只有错误的答案,那些将错误答案嵌入程序的人会遇到严重的问题!他们试图序列化一个nan,并想知道为什么在反序列化数据时得到零!打印(数字从数字到数字(-(0/0)),1)=-(0/0))为假。这并没有保留nan和-nan之间的差异,而且,这是相当多的代码。如果你用叉子做了一个能用的版本就可以了。如果不处理nan,你可以自己轻松地添加它。是的,但我不想检查代码页是否有进一步的错误,如果你这样做了,你会发现你的解决方案没有问题。我没有时间为你的(-0/0)==(-0/0)
测试做SOA,没有“负nan”似乎比扭动好!如何反序列化?在任何lua版本中都有string.format吗?已经试用过了:yout不能使用tonumber反序列化(-)nans和(-)inf,但对于任何其他版本都可以。另外(关于string.format的内容除外)“选项a、a可能在Lua5.2和更高版本中可用。”(它应该适用于任何lua版本),string.pack根本不在我的lua中。“string.format(“%a”,x)在Lua 5.2+中可用。string.pack在Lua 5.3+中可用。“-无法解决问题。还支持NAN、INF和它们的负面版本。似乎可以工作(至少对于我目前使用的lua)。赞成:非常非常简短的解决方案,康特拉:字符串表示非常大。
-- 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)()