黑马程序员技术交流社区
标题: 【上海校区】math库的Python实现原理(pow(a, x)运算) [打印本页]
作者: 梦缠绕的时候 时间: 2018-6-26 09:26
标题: 【上海校区】math库的Python实现原理(pow(a, x)运算)
首先声明这并不一定是实际的底层函数,只是查阅资料根据公式写的,对于指数函数暂时只使用了泰勒展开,若有其他方法欢迎提供原理或公式,该算法原理比较简单,就是泰勒展开,里面需要利用的ln函数在上面的文章中已经提供了,其实也是泰勒展开但情况比这个复杂点,不过下面依旧会提供依赖函数的源码,该系列的目的就是利用基本运算符号,+-*/%进行math库的实现,%不算基本运算,但是太简单和基本就不写单独的了,公式如下,但是对于整数倍发现收敛次数比小数更困难,所以一般整数和小数都是分开算的。
![](https://img-blog.csdn.net/20180624021047827?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20xNTY4MjUzMjI0NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
[python] view plain copy
- Epsilon = 10e-16
-
- def fab_h(x):
- '''''
- 求实数的绝对值
- :param x: R
- '''
- if x >= 0:
- return x
- else:
- return x * -1
-
- def ln_h(x):
- '''''
- ln函数泰勒换元展开
- :param x: 0<x
- :return:ln(x)
- '''
- ln10 = 2.30258509299404568401
-
- def ln_h1(x):
- s2 = 0.0
- delta = x = (x - 1.0) / (x + 1.0)
- i = 0
- while fab_h(delta * 2) / (i * 2 + 1) > Epsilon:
- s2 += delta / (i * 2 + 1)
- delta *= x * x
- i += 1
- return 2 * s2
- coef = 0
- if x > 10:
- while x / 10 > 1:
- coef += 1
- x /= 10
- return ln_h1(x) + coef*ln10
- elif x < 1:
- while x * 10 < 10:
- coef += 1
- x *= 10
- return ln_h1(x) - coef*ln10
- else:
- return ln_h1(x)
-
- def fac_h(x):
- '''''
- 阶乘函数
- x int and x>=1
- '''
- result = 1
- while x > 1:
- result *= x
- x -= 1
- return result
-
- def pow_h(a,x):
- '''''
- 指数函数
- :param a: 底数 R
- :param x: 指数 R
- '''
-
- 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
作者: 吴琼老师 时间: 2018-7-5 16:46
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |