A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  •   

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

[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  


1 个回复

倒序浏览
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马