【问题标题】:how to fix Overflow in turtle rotation如何修复海龟旋转中的溢出
【发布时间】:2019-05-19 02:15:56
【问题描述】:

我正在尝试使用 turtle 的一些代码(只是为了好玩),当我尝试时我感到很惊讶:

import turtle
turtle.speed(0)
for i in range(0,100):
    for x in range(0,i):
        turtle.forward(5)
        turtle.left((2**x)*90)

这按预期正常工作,直到 i = 98 左右突然出现故障 这不应该发生,因为它总是乘以 90,所以它应该总是右转

【问题讨论】:

    标签: python turtle-graphics


    【解决方案1】:

    在我的系统上,故障在第 50 次迭代后开始。问题似乎是程序使用的大整数和海龟使用的浮点数之间的差异。如果我们检测代码:

    angle = 0
    
    for i in range(55):
        for x in range(i):
            turtle.forward(5)
            turtle.left(2**x * 90)
            angle += 2**x * 90
            print(angle % 360, turtle.heading())
    

    一切开始都很好:

    90 90.0
    180 180.0
    0 0.0
    90 90.0
    270 270.0
    

    但最终浮点不精度开始累积:

    270 269.2593644676
    270 269.0124859568
    0 359.0124859568
    180 179.0124859568
    180 179.0124859568
    

    并累积:

    270 258.1498314817
    270 254.1997753089
    0 344.1997753089
    180 164.1997753089
    180 164.1997753089
    

    并最终失控:

    90 42.5993259266
    90 26.7991012355
    180 116.7991012355
    0 296.7991012355
    0 296.7991012355
    

    正如@alexelias 所说,我们可以使用模数来解决这个问题,方法是为turtle 提供一个随着时间的推移累积较少不精确性的值:

    turtle.speed('fastest')
    
    for i in range(100):
        for x in range(i):
            turtle.forward(5)
            turtle.left((2**x % 4) * 90)
    

    我们知道360 / 90 == 4不是将整个值取模360,所以我们只需将另一个值取模4。

    【讨论】:

    • 感谢它确实有效,只是让您知道我发现了一些有趣的东西,如果您将 2 更改为任何其他数字,它会在 4 个不同的模式之间变化非常酷
    • 也尝试用 x^x 代替 2**x
    【解决方案2】:

    试试这个:

    import turtle
    turtle.speed(0)
    for i in range(40,100):
        for x in range(0,i):
            turtle.forward(5)
            turtle.left((2**x*90)%360)
    

    使用模数会将输出限制为 359

    编辑:

    turtlenot your script 中的操作溢出。因此,您可以在将运算发送给turtle之前安全地对其进行模运算。

    【讨论】:

    • 如果您解释为什么原始代码中会发生故障以及为什么如何,这可能会成为一个很好的答案你的代码解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-25
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多