Так как это было Pi день в последнее время , я заметил на ряд из проблем , которые просят вас вычислить пи.
Конечно, пирог с заварным кремом Лотарингия - не совсем пирог (вы можете претендовать на бонусный балл +1, если вы угадали вызов из названия). Таким образом, ваша задача - написать алгоритм или метод, который выглядит на первый взгляд как приближенный к Пи, но гарантированно не сходящийся к Пи.
Это закулисная задача, поэтому убедитесь, что она выдаст 3.14 ... для простого теста, например, с 10 итерациями вашего алгоритма. Это также проблема популярности, так что не надо упускать из виду очевидное echo(pi)
и сказать, что IEEE 754 с плавающей запятой округляет некоторые цифры вверх или вниз.
Победитель получает Киш Лорин².
¹ Предупреждение: на самом деле не бонусный балл. Заявляя счет, вы соглашаетесь испечь мне пирог до Pi Day, 2016
² Предупреждение: Киш Лорейн используется в качестве метафоры для того, чтобы ваш ответ был помечен как «принятый»
источник
Ответы:
Алгоритм
Используя известный результат:
мы определяем в Python 3:
тестирование
Спойлер
источник
Чтобы найти число пи, мы интегрируем это хорошо известное дифференциальное уравнение:
С начальным условием
Хорошо известно, что эта начальная задача сходится к π при возрастании t без границы. Итак, все, что нам нужно, это начать с разумного предположения, что-то между 0 и 2π, и мы можем выполнить численное интегрирование. 3 близко к π, поэтому для начала выберем y = 3.
Вот некоторые результаты для каждого для различного количества шагов:
Как это устроено:
источник
n
? ...for
замедление используетt
, но ваш цикл используетn
.Код:
Я в основном обнаружил эту последовательность случайно. Это начинается как
1, 1
и каждый термин после этогоs(n)
даетсяs(n) = 2*s(n - 1) - s(n - 2) * (1 + m*m)
. Конечный результат является наименьшимn
таким, которыйs(n) < 0
умножается на2m
. Какm
становится меньше, она должна становиться все более и более точным.Я почти уверен, что это ошибки с плавающей точкой, так как
(1 + m*m)
приближается к единице, но я не уверен. Как я уже сказал, я случайно наткнулся на это. Я не уверен в его официальном названии. Не пытайтесь сделать это сm
слишком маленьким или он будет работать вечно (если1 + m*m == 1
из - заm
то , что так мало).Если кто-нибудь знает название этой последовательности или почему она так себя ведет, я был бы признателен.
источник