获得没有数学日志python的对数

时间:2012-11-03 16:33:53

标签: math

我正在学习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))

但它的工作进展非常缓慢。我可以用其他方法吗?谢谢!

6 个答案:

答案 0 :(得分:11)

您可能要考虑的另一件事是使用自然对数的 Taylor系列

enter image description here enter image description here

使用本系列中的一些术语近似自然日志后,很容易更改基数:

enter image description here


编辑 :这是另一个有用的身份:

enter image description here

使用这个,我们可以写一些

的内容
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