【发布时间】: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)
【问题讨论】:
我正在尝试使用 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)
【问题讨论】:
在我的系统上,故障在第 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。
【讨论】:
试试这个:
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
turtle 库 not your script 中的操作溢出。因此,您可以在将运算发送给turtle之前安全地对其进行模运算。
【讨论】: