Lua表索引中的浮点数错误

4
通常,我会通过判断两个浮点数是否在非常小的范围内来进行比较。但是对于表键来说,这种方法不适用,因为你不知道它们的键是否存在(如果这样说有意义的话)。
以下是在64位计算机上使用lua 5.1的示例:
a, b, c = 1.7, -0.8, -0.4
d = a + b + c -- prevents constant folding
print(string.format('%1.20f', d)) --  0.49999999999999989000  (around 0.5)
assert(d ~= 0.5)
t = {[0] = 'foo', [0.5] = 'bar'}
print(t[d]) -- nil  (I want it to print 'bar')

基本上,我想知道如何在查找表中查找键时考虑浮点误差?我希望它能在不与表中每个键进行比较的情况下工作,因此它可以在处理大型表时仍然很快。可能已经有一个内置函数来实现这一点,但我找不到。任何帮助都将不胜感激!
1个回答

4
如果你必须从来自不同来源的浮点数进行索引,我建议你将它们转换为固定格式的字符串,其中包含你想要保留的小数位数,并使用这些字符串索引表。
通过为代理表设置适当的__newindex元方法,甚至可以自动完成此操作。

谢谢,我甚至没有想到那个。另外,__newindex的技巧很棒! - Ryan
1
乘以一个固定的数字,然后使用 math.floor 怎么样? - Deco
1
@Deco,那也可以,但是你必须小心潜在的溢出问题。 - lhf
1
啊,没想到那个! 对于LuaJIT来说,一个有趣的方法是将其转换为“long long”,然后使用ffi.string(可能需要使用联合魔法)。这将非常节省空间...但可能不值得花费这样的精力。 此外,@Ryan:要修复小数位数,您可以使用string.format('%.4f', num) - Deco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接