表索引中的Lua浮点错误

时间:2012-10-11 01:27:43

标签: floating-point lua

通常,我会通过查看它们是否在一个非常小的数字范围内来比较两个浮点数。它不适用于表键,因为你不知道它们是否存在而不知道它们的键(如果这是有意义的话)。

在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 个答案:

答案 0 :(得分:4)

如果你真的必须使用来自不同来源的浮点数进行索引,我建议你将它们转换为固定格式的字符串,这些字符串要保留,并用这些字符串索引表。

您甚至可以通过为代理表设置适当的__newindex元方法来自动完成此操作。