5

我正在学习 Python,我必须编写一个生成日志结果的脚本。

我知道日志基数 x = 结果

然后我做了我的代码。

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))

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

4

6 回答 6

19

您可能要考虑的另一件事是使用自然对数的泰勒级数:

在此处输入图像描述 在此处输入图像描述

一旦您使用本系列中的一些术语来近似自然对数,就很容易更改基数:

在此处输入图像描述


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

在此处输入图像描述

使用它,我们可以写一些类似的东西

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

于 2012-11-03T16:42:38.520 回答
6

我使用递归:

def myLog(x, b):
    if x < b:
        return 0  
    return 1 + myLog(x/b, b)
于 2012-11-06T07:54:40.210 回答
2

您可以为此使用二进制搜索。您可以获取有关二分搜索的更多信息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

类似的东西。

于 2012-11-03T16:36:24.117 回答
1
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
于 2019-04-09T18:59:50.480 回答
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

这更快,使用%timeitiPython 中的魔术函数来计算执行时间以进行比较。

于 2012-11-03T16:39:53.587 回答
0

这将是一个漫长的过程,因为它会进入一个循环。所以,

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)

值几乎相等但不精确。

于 2019-02-18T07:07:46.493 回答