Я написал некоторый код на python для вычисления PI для указанного пользователем количества десятичных разрядов. Я использовал алгоритм Чудновского с деталями, доступными в Википедии здесь: https://en.wikipedia.org/wiki/Chudnovsky_algorithm.
Я уверен, что код работает правильно и возвращает правильные значения для PI. Проблема заключается в том, что, когда пользователь указывает большое количество десятичных знаков (например, 10 000), он или она должны смотреть на мигающий курсор в течение очень долгого времени, прежде чем отобразится результат. Я хотел предоставить пользователю какую-то обратную связь, показывающую ход вычислений. Мне удалось это сделать, но индикатор прогресса настолько сильно замедляет работу программы, что ее невозможно использовать.
Я сделал это следующим образом
Я поделил количество десятичных разрядов, запрошенных пользователем, на десять процентов с помощью генератора
def ten_percent(places):
for i in range(int(places/10),int(places+1),int(places/10)):
yield i
precision_step = ten_percent(places)
precision_check = next(precision_step)
Затем у меня есть очень неуклюжее утверждение, чтобы увидеть, сколько мест мой расчет PI точен
try:
test_num = abs(round(np.log10(abs(decimal.Decimal(next_pi -
current_pi)))))
except:
pass
Во-первых, у меня есть попытка, за исключением того, что в какой-то момент разница между последовательными вычислениями PI становится настолько малой, что вместо целого числа возвращается «Бесконечность».
Next_pi & current_pi - это последовательные вычисления или итерации.
decimal.Decimal используется, потому что могут быть задействованы тысячи десятичных знаков.
абс, чтобы получить положительное число;
np - это NumPy и используется для получения показателя степени в A, умноженного на 10 в степени показателя степени;
abs дает положительное число
Я думаю, что вышеупомянутое утверждение - моя проблема, и я предполагаю, что вычисление "log10" занимает слишком много времени.
У меня тогда есть этот код
if test_num >= precision_check:
print('Calculation steps: ' + str(counter-1) + ' Approximate decimal
places: ' + str(precision_check))
if precision_check < places:
precision_check = next(precision_step)
Переменная test_num, по сути, является моим текущим числом десятичных знаков для вычисления PI.
Переменная precision_check - это текущий десятипроцентный шаг количества запрошенных пользователем десятичных знаков. (В основном я хочу дать обратную связь в десяти процентах, рассчитанных на двадцать процентов десятичных знаков.)
Как только я предоставляю обратную связь, я увеличиваю ее до следующих десяти процентов.
Эта система обратной связи работает, но делает код намного медленнее. Для небольшого числа десятичных разрядов, таких как 100, код в десять раз медленнее, но с увеличением количества десятичных разрядов он становится все медленнее и медленнее.
Спасибо
Адриан