как исправить переполнение при вращении черепахи - PullRequest
2 голосов
/ 19 мая 2019

Я пробовал какой-то код с черепахой (просто для удовольствия), и я удивился, когда попытался:

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, когда он внезапно дал сбой Glitch это не должно происходить, так как оно всегда умножается на 90, поэтому всегда должен быть поворот направо

Ответы [ 2 ]

2 голосов
/ 19 мая 2019

В моей системе сбой начинается после итерации 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.speed('fastest')

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

Вместо того, чтобы модулировать все значение на 360, мы знаем, что 360 / 90 == 4, поэтому мы просто модулируем другое значение на 4.

2 голосов
/ 19 мая 2019

попробуйте это:

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

Edit:

операция была переполнена в библиотеке turtle, не в вашем скрипте . Таким образом, вы можете безопасно смоделировать операцию, прежде чем отправить ее черепахе.

...