我正在学习Python,我必须做一个生成日志结果的脚本。
我知道log base x = result
然后我制作了我的代码。
def log(x, base):
log_b = 2
while x != int(round(base ** log_b)):
log_b += 0.01
print log_b
return int(round(log_b))
但它的工作进展非常缓慢。我可以用其他方法吗?谢谢!
答案 0 :(得分:11)
您可能要考虑的另一件事是使用自然对数的 Taylor系列:
使用本系列中的一些术语近似自然日志后,很容易更改基数:
编辑 :这是另一个有用的身份:
使用这个,我们可以写一些
的内容def ln(x):
n = 1000.0
return n * ((x ** (1/n)) - 1)
测试一下,我们有:
print ln(math.e), math.log(math.e)
print ln(0.5), math.log(0.5)
print ln(100.0), math.log(100.0)
输出:
1.00050016671 1.0
-0.692907009547 -0.69314718056
4.6157902784 4.60517018599
这显示我们的值与math.log
值(由空格分隔)相比较,如您所见,我们非常准确。当你变得非常大时,你可能会开始失去一些准确性(例如ln(10000)
将比它应该大约0.4
),但如果你需要,你总是可以增加n
。
答案 1 :(得分:1)
我使用了递归:
def myLog(x, b):
if x < b:
return 0
return 1 + myLog(x/b, b)
答案 2 :(得分:1)
这将是一个漫长的过程,因为它会循环进行。因此,
def log(x,base):
result = ln(x)/ln(base)
return result
def ln(x):
val = x
return 99999999*(x**(1/99999999)-1)
log(8,3)
值几乎相等,但不精确。
答案 3 :(得分:0)
您可以使用二进制搜索。 您可以获得有关二元搜索http://en.wikipedia.org/wiki/Binary_search_algorithm;
的更多信息基本上你从0和x开始并应用算法。我会在一分钟内为你写一些代码。
def log(x, base, mn, mx):
if (mn <= mx):
med = (mn + mx) / 2.0
if x == int(round(base ** med)):
return int(round(log_b))
if x > int(round(base ** med)):
return log(x, base, med, mx)
if x < int(round(base ** med)):
return log(x, base, mn, med)
return 0
类似的东西。
答案 4 :(得分:0)
比较: -
这是您的日志的工作方式: -
def your_log(x, base):
log_b = 2
while x != int(round(base ** log_b)):
log_b += 0.01
#print log_b
return int(round(log_b))
print your_log(16, 2)
# %timeit %run your_log.py
# 1000 loops, best of 3: 579 us per loop
这是我提议的改进: -
def my_log(x, base):
count = -1
while x > 0:
x /= base
count += 1
if x == 0:
return count
print my_log(16, 2)
# %timeit %run my_log.py
# 1000 loops, best of 3: 321 us per loop
更快,使用iPython中的%timeit
魔术函数为执行计时以进行比较。
答案 5 :(得分:0)
import math
try :
number_and_base = input() ##input the values for number and base
##assigning those values for the variables
number = int(number_and_base.split()[0])
base = int(number_and_base.split()[1])
##exception handling
except ValueError :
print ("Invalid input...!")
##program
else:
n1 = 1 ##taking an initial value to iterate
while(number >= int(round(base**(n1),0))) : ##finding the most similer value to the number given, varying the vlaue of the power
n1 += 0.000001 ##increasing the initial value bit by bit
n2 = n1-0.0001
if abs(number-base**(n2)) < abs(base**(n1)-number) :
n = n2
else :
n = n1
print(math.floor(n)) ##output value