Как эффективно рассчитать числа в диапазоне цифр для показательной функции - PullRequest
0 голосов
/ 28 марта 2020

У меня есть экспоненциальная функция x ^ n, где x - это число от 0 до 1, а n - большое целое число (обычно> 100). Предположим, что нет ошибки округления для x и n, когда они представлены числом двойной точности. Как я могу эффективно рассчитать числа в диапазоне цифр для x ^ n? Например, я хочу получить только цифры в двух тысячах и первых десятичных разрядах для 0,123 ^ 1000.

Я знаю, что высокоточная библиотека, такая как MPFR, прекрасно справляется с этой задачей, но она значительно медленнее, чем вычисления с двойной точностью. Поскольку мне не нужны все числа в числе, я ищу более эффективный способ сделать это, но я понятия не имею об этом. Будем благодарны за любые предложения или советы.

==================== update1 =============== =====

Спасибо за комментарии и ответы всех ваших парней, я заметил, что пример в вопросе может быть неуместным, потому что число все еще недостаточно мало, чтобы вызвать усечение, поэтому я изменяю его на 0.123 ^ 1000.

Для тех, кто предпочитает видеть какой-то реальный код, я сделал воспроизводимый пример в R

x <- 0.123^1000
sprintf("%.10e",x)
y <- mpfr(0.123,precBits = 10000)^1000
y

x - число с двойной точностью, и результат равен 0, y является числом с точностью до 10000 битов и может фактически показывать номер результата в 2001-м десятичном виде git. Обратите внимание, что первые несколько (может быть, много) значащих цифр, как правило, не представляют интереса, то есть, если истинный ответ экспоненциальной функции равен 0,123 + 4 * 10 ^ 10000, я бы заинтересовался этой "4", а не любые числа в 1,2,3. Вот почему высокоточная библиотека здесь может не подходить, поскольку она будет выполнять много ненужных вычислений.

1 Ответ

1 голос
/ 28 марта 2020

Вам нужна библиотека для расчетов с большими целыми числами . Вы можете реализовать рациональных чисел с этой библиотекой и соответствующими вычислениями. Тогда легко получить любое десятичное число git рационального числа. Посмотрите на пример кода в Python.

Если вас интересует десятичное число git d из рационального числа f, вы вычисляете f * 10^d, используете только его целую часть и возьмите только младшее значащее число di git.

import fractions

def get_digit(f, d):
    f1 = f * 10**d
    return (f1.numerator // f1.denominator) % 10

f = fractions.Fraction(123, 1000)
p = f ** 100

assert get_digit(p, 91) == 0
assert get_digit(p, 92) == 9
assert get_digit(p, 93) == 7
assert get_digit(p, 94) == 8
assert get_digit(p, 95) == 3
assert get_digit(p, 96) == 8

Обновление:

На n-е десятичное число di git влияют все менее значимые десятичные цифры во время вычислений. По этой причине невозможно вычислить n-й десятичный знак di git напрямую . А количество необходимых значащих цифр делает тип данных двойной точности бесполезным. По этой причине расчет больших целых чисел является разумным практическим компромиссом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...