Lua 浮点精度搞砸了?

Lua float precision messed up?

提问人:Riccardo Di Michele 提问时间:5/9/2023 最后编辑:Riccardo Di Michele 更新时间:6/9/2023 访问量:76

问:

免责声明:我在桌面模拟器游戏中使用 lua,我不知道这是否以任何方式干扰了 lua 的“正常工作”

我已经预先计算了一堆向量:

    grey_res = {55.00, 3, -10.80},
    commerce = {55.00, 3, -8.10},
    blue = {55.00, 3, -5.40},
    war_conflict = {55.00, 3, -2.70},
    naval_conflict = {55.00, 3, 0},
    compass = {55.00, 3, 2.70},
    tablet = {55.00, 3, 5.40},
    gear = {55.00, 3, 8.10},
    green_island = {55.00, 3, 10.80},

我设法找到正确的公式来计算这些带有原点和偏移量的值 但这是 Lua 输出

    Vector: { 54.999997, 3, -10.800006}
    Vector: { 54.999997, 3, -8.100005}
    Vector: {54.999996, 3, -5.400006}
    Vector: {54.999995, 3, -2.700005}
    Vector: {54.999995, 3, -0.000005}
    Vector: {54.999995, 3, 2.699995}
    Vector: {54.999994, 3, 5.399996}
    Vector: {54.999994, 3, 8.099996}
    Vector: {54.999994, 3, 10.799996}

正如你所看到的,坐标与我设计的坐标有点匹配,但它们仍然关闭,因为我需要对它们进行其他操作,我担心它们会弄乱我的对象的位置 有没有办法解决这个问题?

我正在考虑用if语句解决这个问题,但代码会变得非常混乱

编辑:这些只是一些坐标示例,实际上所有这些值对于牌桌上的每个玩家都会发生变化,因此对于其中一些人来说,x 可能是正浮点数,对于其他人来说是负浮点数,z 也是如此

LUA 浮动精度 桌面模拟器

评论

3赞 Nifim 5/9/2023
这回答了你的问题吗?浮点数学坏了吗?
4赞 Luatic 5/9/2023
不,这不是重复的。不过,它需要调试细节。为什么这不是重复的?首先,像这样的小整数可以精确地用浮点数表示——甚至是 32 位的浮点数。那里应该有绝对零误差(除非在浮点数上做了一些数学运算,在这种情况下,数学可能会被修复以产生确切的结果)。此外,Lua 通常使用 64 位浮点数,其误差非常小;然而,这里的错误相当大,大约在小数点后第六位,这表明正在发生一些向 32 位浮点数的转换。55
2赞 Luke100000 5/9/2023
如果 Vector 使用 32 位浮点数,它将与具有 1 位误差的浮点数完美匹配,四舍五入以进行打印。“我找到了正确的公式”听起来不像输入了确切的整数。
1赞 Eric Postpischil 5/9/2023
编辑问题以提供最小的可重现示例
2赞 Nifim 5/10/2023
@EricPostpischil:@Luatic似乎假设 OP 输入了字面意思,而不是进行一系列计算。根据帖子中的文字,这不是我得出的结论,也不是我认为应该得出的结论。无论如何,如果帖子被关闭,您将能够投票重新打开它,我们还没有收到 OP 的任何回复。55

答:

0赞 ikegami 6/9/2023 #1

这是 Tabletop Simulator 的已知问题