Math 不使用数学日志获取对数

Math 不使用数学日志获取对数,math,Math,我正在学习Python,我必须编写一个生成日志结果的脚本 我知道log base 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)) 但它的工作非常缓慢。我可以用其他方法吗?谢谢 您可以使用二进制搜索。 你可以得到更多关于二进制搜索的信息 基本上从0和x开始,应用算法。

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

我知道log base 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))

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

您可以使用二进制搜索。 你可以得到更多关于二进制搜索的信息

基本上从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
def日志(x、base、mn、mx):
如果(mn int(圆形(底部**med)):
返回日志(x、基本、中间、mx)
如果x
类似的东西。

比较:-

以下是日志的工作方式:-

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中使用<代码> %TimeT< <代码>魔法函数来执行比较。

< P> >你想考虑的另一件事是使用自然对数的泰勒级数:

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


编辑:下面是另一个有用的标识:

利用这一点,我们可以按照

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

我使用了递归:

def myLog(x, b):
    if x < b:
        return 0  
    return 1 + myLog(x/b, b)
def myLog(x,b):
如果x
这将是一个漫长的过程,因为它是循环的。因此

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)
值几乎相等,但不精确。

导入数学
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
尝试: number_和_base=input()##输入number和base的值 ##为变量分配这些值 number=int(number_和_base.split()[0]) base=int(数字\u和\u base.split()[1]) ##异常处理 除值错误外: 打印(“无效输入…!”) ##节目 其他: n1=1##取初始值进行迭代 而(number>=int(round(base**(n1),0)):##找到与给定数字最相似的值,改变幂的值 n1+=0.000001##逐位增加初始值 n2=n1-0.0001 如果abs(基数**(n2))
当然,有很多算法。你对其中一些算法做一些研究,如果你需要帮助理解一个算法,就来问一个具体的问题如何?这太荒谬了……我怀疑这是大学作业。一些教授拒绝让学生使用标准的LIB。老实说,你不会学这样的东西除非你第一次为自己实现了一些东西(很糟糕),为什么你不去做呢?它列出了许多计算日志的方法,并尝试实现它们,然后问一个具体的问题:二进制搜索是一个排序序列上的搜索算法。虽然同样的想法可以应用于其他问题,但这是一个不同的算法(可能是二等分?)。我假设[0,x]是一个排序序列,我使用二进制搜索搜索结果。复杂性是O(logx)否,实数不是离散的,而序列中的索引是离散的。当然,您可以将其限制在特定范围内(从某种意义上说,你必须这样做,通过使用有限精度的数字表示)。但从概念上讲,这是一种不同的算法。同样,使用“二进制搜索”你可以计算值的平方根,它也是实的。你只需要限制算法的步数,你可以很容易地确定,或者增加一个误差。再说一遍,这不是二进制搜索算法(至少不是CS意义上的,我刚刚读到的二分法也称为“二进制搜索方法”)即使它建立在一个类似的概念上。它不搜索一个值序列,它近似于一个函数。可以显式存储值,然后搜索它们并不意味着它是相同的,同样的,二进制搜索不是一个平衡的二进制搜索树。+1,但是有什么特别的原因让你在日志10中包含这个步骤吗
在你上一个等式中?@phant0m这是我复制的图像的一部分,如果我有选择的话,我不会把它包括在内。哦,刚刚找到一个更好的:-)啊,我明白了。我倾向于用这个来制作几乎是手工制作的图像;)这绝对是一个不错的资源-将其添加到我的书签中!欢迎使用StackOverflow。只使用代码的答案是不受欢迎的。你能为这段代码添加一些解释吗,特别是关于这段代码如何做了其他答案没有做的事情?另外,如果你打算继续在这里给出答案,你应该学会如何格式化你的答案。我很高兴打开您的代码,然后按
Ctrl+K
,将所有内容缩进四个空格,使其看起来像浏览器中的代码。谢谢您的建议。我将观察您在此处所说的内容。