我需要计算 mpmath 的“mpf”浮点大数形式下的小值的反正弦函数。
我所说的“小”值是例如 e/4/(10**7) = 0.000000067957045711476130884...
这是在我的机器上使用 mpmath 的内置 asin 函数进行测试的结果:
import gmpy2
from mpmath import *
from time import time
mp.dps = 10**6
val=e/4/(10**7)
print "ready"
start=time()
temp=asin(val)
print "mpmath asin: "+str(time()-start)+" seconds"
>>> 155.108999968 seconds
这是一个特殊情况:我处理的数字有点小,所以我问自己是否有一种方法可以在 python 中计算它,在这种特殊情况下(= 对于小值)实际上胜过 mpmath。
泰勒级数实际上是一个不错的选择,因为它们对于小参数收敛得非常快。但我仍然需要以某种方式进一步加速计算。
实际上存在一些问题:
1)二元分割在这里是无效的,因为只有当你可以将参数写成一个小分数时,它才会发挥作用。这里给出了一个全精度 float 。
2)反正弦是一个非交替级数,因此 Van Wijngaarden 或 sumalt 变换也无效(除非有一种我不知道的方法可以将它们概括为非交替级数)。
https://en.wikipedia.org/wiki/Van_Wijngaarden_transformation
我能想到的唯一加速度是切比雪夫多项式。切比雪夫多项式可以应用于反正弦函数吗?怎么做?
最佳答案
您可以使用 gmpy2 中包含的 mpfr
类型吗?
>>> import gmpy2
>>> gmpy2.get_context().precision = 3100000
>>> val = gmpy2.exp(1)/4/10**7
>>> from time import time
>>> start=time();r=gmpy2.asin(val);print time()-start
3.36188197136
除了支持 GMP 库之外,gmpy2 还支持 MPFR 和 MPC 多精度库。
免责声明:我维护 gmpy2。
关于python - 针对小任意浮点值的 arcsin 函数的最快可能方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18237503/