Следующие примеры кода моя проблема, которая не возникает между 10 мощностью 10 и 10 мощностью 11, но для примера приведена в коде и над ним.Python - Как избежать расхождения базы y ** log base y of x, in gmpy2
Я не вижу, где в моем коде я неправильно обрабатываю исходное значение. Может быть, я просто пропустил что-то простое.
Я должен быть уверен, что смогу восстановить x
от log x
для различных баз. Вместо того, чтобы полагаться на библиотечную функцию, такую как gmpy2
, есть ли обратный алгоритм анти-журнала, который гарантирует, что, например, 2**log2(x)
он даст x
.
Я могу видеть, как напрямую разработать журнал, но не как вернуться, например, серия Тейлора требует много терминов ... How can I write a power function myself? и @ dan04 ответ. Далее следует код.
from gmpy2 import gcd, floor, next_prime, is_prime
from gmpy2 import factorial, sqrt, exp, log,log2,log10,exp2,exp10
from gmpy2 import mpz, mpq, mpfr, mpc, f_mod, c_mod,lgamma
from time import clock
import random
from decimal import getcontext
x=getcontext().prec=1000 #also tried 56, 28
print(getcontext())
def rint():#check accuracy of exp(log(x))
e=exp(1)
l2=log(2)
l10=log(10)
#x=random.randint(10**20,10**21) --replaced with an actual value on next line
x=481945878080003762113
# logs to different bases
x2=log2(x)
x10=log10(x)
xe=log(x)
# logs back to base e
x2e=xe/l2
x10e=xe/l10
#
e2=round(2**x2)
e10=round(10**x10)
ex=round(e**xe)
#
ex2e=round(2**x2e)
ex10e=round(10**x10e)
error=5*x-(e2+e10+ex+ex2e+ex10e)
print(x,"error sum",error)
#print(x,x2,x10,xe)
#print(x2e,x10e)
print(e2,e10,ex)
print(ex2e,ex10e)
rint()
Во-первых, я не знаю, как вы получили «random.randint» для работы с этими ограничениями. Это не на моей машине ... Но в любом случае я подозреваю, что это связано с арифметической точностью float. – Aguy
Я думаю, что вы правы, и в этом случае мой вопрос: как мне обойти это, как в python, так и в gmpy2 или в какой-то другой библиотеке? – ocopa
Я могу получить анти-журнал по методу, описанному на https://en.wikipedia.org/wiki/Exponentiation_by_squaring, поэтому для журнала 2 это вопрос не перехода через естественный журнал, а непосредственно вычисление базы журнала 2. – ocopa