【发布时间】:2016-07-27 10:08:42
【问题描述】:
以下代码示例我的问题不会发生在 10 次方 10 和 10 次方 11 之间,但对于代码中给出的示例及其上方的示例。
我看不到我在代码中的哪些地方没有正确处理原始值的检索。可能是我错过了一些简单的事情。
我需要确保我可以从 log x 恢复 x 用于各种基础。与其依赖诸如gmpy2 之类的库函数,是否有任何反向anti-log 算法可以保证例如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处理这些限制的。它不在我的机器上......但无论如何我怀疑这与浮点算术精度有关。 -
我认为你是对的,在这种情况下,我的问题是,我如何解决这个问题,无论是在 python 还是 gmpy2 或其他一些库中?
-
我可以通过en.wikipedia.org/wiki/Exponentiation_by_squaring描述的方法得到反对数,所以对于log 2来说,不是通过自然对数,而是直接计算log base 2。