【问题标题】:Lua floating point errors in table index表索引中的 Lua 浮点错误
【发布时间】:2012-10-11 09:41:31
【问题描述】:

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

在 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')

基本上,如何在考虑浮点错误的同时找到表中的键?我希望它在不与表中的每个键进行比较的情况下工作,因此它仍然可以在大表中快速运行。可能已经有一个内置函数可以执行此操作,但我找不到。

任何帮助将不胜感激!

【问题讨论】:

    标签: floating-point lua


    【解决方案1】:

    如果您确实必须从来自不同来源的浮点数索引,我建议您将它们转换为固定格式的字符串,您希望保留尽可能多的小数位,并使用这些字符串为表格编制索引。

    您甚至可以通过为代理表设置适当的__newindex 元方法来自动实现这一点。

    【讨论】:

    • 谢谢,我没想到。此外,__newindex 的绝妙技巧!
    • 如何将其乘以一个固定的数字,然后使用math.floor
    • @Deco,这也可以,但你必须小心潜在的溢出。
    • 啊,真的……没想到! LuaJIT 的一个有趣方法是将其转换为long long,然后使用ffi.string(可能使用联合魔法)。这将非常节省空间......但可能不值得付出努力。另外,@Ryan:要固定小数位数,您可以使用string.format('%.4f', num)
    猜你喜欢
    • 1970-01-01
    • 2014-05-27
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    相关资源
    最近更新 更多