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


你可能感兴趣的:(math函数python实现)