Python:计算sine/cosine,精度可达100万位
Python: Calculate sine/cosine with a precision of up to 1 million digits
问题不言自明。我看过几个 pi 的例子,但没有看到 trigo 函数。也许可以使用泰勒级数 as done here,但我不完全确定如何在 python 中实现它。特别是如何存储这么多数字。
我应该提到:理想情况下,这将 运行 在香草 python 上,即没有 numpy 等
谢谢!
编辑:如前所述,我知道之前有人问过这个问题,但它在 java 中,我正在寻找 python 实现:)
编辑 2:哇,我不知道这里的人可以如此专注。我确实尝试了几种方法,但 none 会起作用。我以为这是一个你可以寻求建议的地方,我猜我错了
上次编辑:对于可能觉得这有用的任何人:许多角度可以计算为 sqrt(2)、sqrt(3) 和 Phi (1.61803..) 的倍数,因为这些数字可以精确地广泛使用最多 10mio 位,将它们放在文件中并直接在程序中读取它们很有用
import math
x = .5
def sin(x):
sum = 0
for a in range(0,50): #this number (50) to be changed for more accurate results
sum+=(math.pow(-1,a))/(math.factorial(2*a+1))*(math.pow(x,2*a+1))
return sum
ans = sin(x)
print(str.format('{0:.15f}', ans)) #change the 15 for more decimal places
这是一个使用 python 实现泰勒级数的示例,如您上面所建议的。之后转cos就不难了。
编辑:
在最后一行的格式中添加,以便实际打印出更多的小数位。
mpmath 是这样的:
from mpmath import mp
precision = 1000000
mp.dps = precision
mp.cos(0.1)
如果无法安装 mpmath 或任何其他模块,您可以按照建议尝试多项式逼近。
其中 Rn 是 拉格朗日余数
请注意,一旦 x 离开中心 x,Rn 就会快速增长0,所以在尝试计算 sin(x)[= 时要小心使用 麦克劳林级数(以 0 为中心的泰勒级数) 44=] 或 cos(x) of 任意 x.
试试这个
import math
from decimal import *
def sin_taylor(x, decimals):
p = 0
getcontext().prec = decimals
for n in range(decimals):
p += Decimal(((-1)**n)*(x**(2*n+1)))/(Decimal(math.factorial(2*n+1)))
return p
def cos_taylor(x, decimals):
p = 0
getcontext().prec = decimals
for n in range(decimals):
p += Decimal(((-1)**n)*(x**(2*n)))/(Decimal(math.factorial(2*n)))
return p
if __name__ == "__main__":
ang = 0.1
decimals = 1000000
print 'sin:', sin_taylor(ang, decimals)
print 'cos:', cos_taylor(ang, decimals)
问题不言自明。我看过几个 pi 的例子,但没有看到 trigo 函数。也许可以使用泰勒级数 as done here,但我不完全确定如何在 python 中实现它。特别是如何存储这么多数字。 我应该提到:理想情况下,这将 运行 在香草 python 上,即没有 numpy 等
谢谢!
编辑:如前所述,我知道之前有人问过这个问题,但它在 java 中,我正在寻找 python 实现:)
编辑 2:哇,我不知道这里的人可以如此专注。我确实尝试了几种方法,但 none 会起作用。我以为这是一个你可以寻求建议的地方,我猜我错了
上次编辑:对于可能觉得这有用的任何人:许多角度可以计算为 sqrt(2)、sqrt(3) 和 Phi (1.61803..) 的倍数,因为这些数字可以精确地广泛使用最多 10mio 位,将它们放在文件中并直接在程序中读取它们很有用
import math
x = .5
def sin(x):
sum = 0
for a in range(0,50): #this number (50) to be changed for more accurate results
sum+=(math.pow(-1,a))/(math.factorial(2*a+1))*(math.pow(x,2*a+1))
return sum
ans = sin(x)
print(str.format('{0:.15f}', ans)) #change the 15 for more decimal places
这是一个使用 python 实现泰勒级数的示例,如您上面所建议的。之后转cos就不难了。
编辑:
在最后一行的格式中添加,以便实际打印出更多的小数位。
mpmath 是这样的:
from mpmath import mp
precision = 1000000
mp.dps = precision
mp.cos(0.1)
如果无法安装 mpmath 或任何其他模块,您可以按照建议尝试多项式逼近。
其中 Rn 是 拉格朗日余数
请注意,一旦 x 离开中心 x,Rn 就会快速增长0,所以在尝试计算 sin(x)[= 时要小心使用 麦克劳林级数(以 0 为中心的泰勒级数) 44=] 或 cos(x) of 任意 x.
试试这个
import math
from decimal import *
def sin_taylor(x, decimals):
p = 0
getcontext().prec = decimals
for n in range(decimals):
p += Decimal(((-1)**n)*(x**(2*n+1)))/(Decimal(math.factorial(2*n+1)))
return p
def cos_taylor(x, decimals):
p = 0
getcontext().prec = decimals
for n in range(decimals):
p += Decimal(((-1)**n)*(x**(2*n)))/(Decimal(math.factorial(2*n)))
return p
if __name__ == "__main__":
ang = 0.1
decimals = 1000000
print 'sin:', sin_taylor(ang, decimals)
print 'cos:', cos_taylor(ang, decimals)