【问题标题】:Lua: What is typical approach for using calculated values in a for loop?Lua:在 for 循环中使用计算值的典型方法是什么?
【发布时间】:2019-02-01 06:30:18
【问题描述】:

在 LUA(introduction of integers in 5.3 之前)中处理 for 循环中计算的范围值的典型方法是什么? numerical for 循环中开始和结束值的数学计算会使代码面临错误的风险,可能是令人讨厌的潜在错误,因为这只会发生在某些值和/或计算顺序发生变化时。这是一个不产生期望输出的循环的编造示例:

a={"a","b","c","d","e"}
maybethree = 3 
maybethree = maybethree / 94
maybethree = maybethree * 94
for i = 1,maybethree do print(a[i]) end

这会产生两个项目的不幸输出,而不是所需的三个(在 64 位 x86 上的 5.1.4 上测试):

a
b

不熟悉这个领域的程序员可能会被 print() 输出弄糊涂,因为它会打印 3!

将舍入函数应用于最接近的整数可以在这里工作。我了解 approximatation with FP 以及为什么会失败,我对 LUA 中的典型样式/解决方案感兴趣。

相关问题:

【问题讨论】:

    标签: for-loop lua floating-point


    【解决方案1】:

    解决方案是避免这种对浮点数学的依赖,因为浮点精度可能会成为问题。或者,更实际地,在使用 FP 时要注意并注意精度问题。这不是一个需要 Lua 特定解决方案的 Lua 问题。

    maybethree 用词不当:它从不三个。您上面的代码是确定性的。它总是只打印ab。由于maybethree变量小于3,当然for循环不会执行3次。

    print 函数的行为也符合定义/预期。使用string.format 展示 FP 号码的所有荣耀:

    print(string.format("%1.16f", maybethree)) -- 2.9999999999999996
    

    仍然需要使用计算值来控制您的for 循环吗?那么你已经提到了答案:实现一个舍入函数。

    【讨论】:

    • 我认为 lua 将天真的程序员置于比其他语言更高的风险中?例如,如果您在 Python 3 中使用 for i in range(maybethree) 尝试类似的事情,那么它将抛出 TypeError 异常。
    • 也许吧。也就是说,在太天真的重压下很难编程。必须继续学习!这就是 SO 的优点。
    • 语言规范是否需要 64 位 IEEE 754 并且是否指定了路由方法,例如FE_TONEAREST。感觉这会影响可能三号为 3 的可能性。
    猜你喜欢
    • 2020-12-04
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多