math库的Python实现原理(pow(a, x)运算)

首先声明这并不一定是实际的底层函数,只是查阅资料根据公式写的,对于指数函数暂时只使用了泰勒展开,若有其他方法欢迎提供原理或公式,该算法原理比较简单,就是泰勒展开,里面需要利用的ln函数在上面的文章中已经提供了,其实也是泰勒展开但情况比这个复杂点,不过下面依旧会提供依赖函数的源码,该系列的目的就是利用基本运算符号,+-*/%进行math库的实现,%不算基本运算,但是太简单和基本就不写单独的了,公式如下,但是对于整数倍发现收敛次数比小数更困难,所以一般整数和小数都是分开算的。

def pow_h(a,x):
    '''
    指数函数
    泰勒展开,在指数小于1时收敛缓慢甚至不收敛所以采用牛顿迭代
    调用自身pow()的指数倒数计算
    范围受限于浮点设置,更高精度需要重写float
    :param a: 底数    R
    :param x: 指数    1/10^300 < x <10^300
    '''
    if x < 1:
        n = 1/x
        val = a
        last = 0.0
        while (fab_h(val - last) > Epsilon):
            last = val
            val = ((n - 1) * val + a / pow_h(val, n - 1)) / n
        return val

    result = 1.0
    coef_fac = 1.0
    if x % 1 == 0:
        '''整数倍'''
        while coef_fac <= x:
            result *= a
            coef_fac += 1
        return result

    exp = exp_orgin = x*ln_h(a)
    '''小数倍'''
    while fab_h(result - exp/fac_h(coef_fac)) > Epsilon:
        result += exp/fac_h(coef_fac)
        exp *= exp_orgin
        coef_fac += 1
    return result


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值