python - 针对小任意浮点值的 arcsin 函数的最快可能方法

标签 python trigonometry bignum taylor-series mpmath

我需要计算 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/

相关文章:

android - 使用 buildozer 和 kivy 在 python 中制作 android 应用程序

c++ - 仅移动一个点来改变圆弧的形状

c++ - 求圆内坐标的角度

python - 如何将图像从 URL 传递到 Django 模板?

python - Python 上的 MongoDB Atlas 身份验证失败

c - 具有巨大数字的基本数学运算

javascript - 如何在javascript中处理大数字

javascript - 斐波那契数列 1 kk 迭代

python - 问题: how to reference to objects/variables created in decorator from injected method?

lua - Torch Lua,如何计算两个张量的每对单值的余弦距离?