Индикатор прогресса, рассчитывающий ПИ на многие десятичные знаки - PullRequest
0 голосов
/ 26 октября 2018

Я написал некоторый код на python для вычисления PI для указанного пользователем количества десятичных разрядов. Я использовал алгоритм Чудновского с деталями, доступными в Википедии здесь: https://en.wikipedia.org/wiki/Chudnovsky_algorithm.

Я уверен, что код работает правильно и возвращает правильные значения для PI. Проблема заключается в том, что, когда пользователь указывает большое количество десятичных знаков (например, 10 000), он или она должны смотреть на мигающий курсор в течение очень долгого времени, прежде чем отобразится результат. Я хотел предоставить пользователю какую-то обратную связь, показывающую ход вычислений. Мне удалось это сделать, но индикатор прогресса настолько сильно замедляет работу программы, что ее невозможно использовать.

Я сделал это следующим образом

  1. Я поделил количество десятичных разрядов, запрошенных пользователем, на десять процентов с помощью генератора

    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, код в десять раз медленнее, но с увеличением количества десятичных разрядов он становится все медленнее и медленнее.

Спасибо

Адриан

...