首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Python计算基数-10对数的算法

用Python计算基数-10对数的算法
EN

Stack Overflow用户
提问于 2018-03-18 23:34:38
回答 1查看 1.6K关注 0票数 1

我试图创建一个程序,根据“数学函数计算手册”中描述的基于泰勒级数的算法计算基数-10对数(我通过我的大学图书馆找到了一份在线副本)。

在StackOverflow上的另一个问题上给出了一个类似的算法,我现在找不到链接。

10.3.2在十进制基数中计算对数 对于十进制基,基数-10对数是自然的选择,将参数分解为指数和分数给出了一个十进制表示:X= (−1) ^s×f×10^n,或者f=0,或者f是1/10,1)。 设f≤√1/ 10,设f=10×f,n=n−1,使f现在处于区间(√1/10,√10 )。然后引入变量的变化,泰勒级数展开,以及该展开的多项式表示: Z= (f−1)/( f+ 1), F= (1 + z)/(1−z), D=2 log10(e) = 2/ log(10) log10( f) =D×(z + z3/3 + z5/5 + z7/7 + z9/9 + z11/11 +··) z3Q(z2),多项式拟合在Q(z2)中包含D。 对于f in (√1/10,√10),我们有大约−0.5195,+0.5195中的z。与二进制情形相比,z的范围更广,需要更长的多项式,并且使得修正项z3Q(z2)相对较大。它的大小不超过0.35z,所以它只提供了一个额外的十进制数字的精度,而不是两个。与二进制情况相比,精确计算z更容易:只需设置z=fl(fl(f−12)−12)−(f+1)即可。

为此,我用Python编写了这个程序:

代码语言:javascript
复制
def log10(x):

n = 0.0 #Start exponent of base 10

while (x >= 1.0):
    x = x/10.0
    n+=1


# if x <= sqrt(1/10)
if(x<=0.316227766016838):
    x = x*10.0
    n = n-1

#Produce a change of variable
z = (x-1.0)/(x+1.0)
D = 4.60517018598809 #2*log10(e)

sum = z
for k in range(3,111,2):
    sum+=(z**k)/k

return D*n*sum

我将结果与math.log10函数进行了比较,结果并不如预期的那样。调试时我最大的问题是理解算法及其工作原理。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-19 00:23:44

下面是我建议更正后的源代码(将返回语句更改为D*sum+n,修正了D的值,并将if(x<=0.316227766016838)更改为while(x<=0.316227766016838) )。我添加了一些if语句来处理异常情况。

下面的代码在6位的目标精度范围内工作得很好(我用非常小的输入测试了它,输入很大)。

代码语言:javascript
复制
def log10(x):

    # Handle exceptional cases
    if (x == 1):
        return 0
    if (x == 0):
        return float('-Inf')
    if (x < 0):
        return float('nan')

    n = 0 #Start exponent of base 10

    while (x >= 1.0):
        x = x/10.0
        n+=1

    # if x <= sqrt(1/10)
    while(x<=0.316227766016838):
        x = x*10.0
        n = n-1

    #Produce a change of variable
    z = (x-1.0)/(x+1.0)
    D = 0.868588964 #2*log10(e)

    #Taylor series
    sum = z
    for k in range(3,23,2):
        sum+=(z**k)/k

    return D*sum+n
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49353928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档