问题非常明显。我已经看过pi的几个例子,但没有看到trigo函数。也许有人可以使用泰勒系列as done here,但我并不完全确定如何在python中实现它。特别是如何存储这么多数字。 我应该提一下:理想情况下,这将在vanilla python上运行,即没有numpy等。
谢谢!
编辑:如上所述,我知道之前已经问过这个问题,但是在java中我正在寻找一个python实现:)编辑2:哇我不知道这里的人可以如此自我吸收。我确实尝试了几种方法但没有一种方法可行。我认为这是一个你可以征求意见的地方,我猜错了
最后编辑:对于任何可能发现这个有用的人:许多角度可以计算为sqrt(2),sqrt(3)和Phi(1.61803 ..)的倍数。因为这些数字可以广泛使用,精度高达10十位数字,将它们放入文件并直接在程序中读取它们非常有用
答案 0 :(得分:2)
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实现Taylor系列的示例,如上所述。之后改为cos不会太难。
修改强>
在最后一行的格式中添加,以便实际打印出更多小数位。
答案 1 :(得分:2)
mpmath就是这样:
from mpmath import mp
precision = 1000000
mp.dps = precision
mp.cos(0.1)
如果无法安装mpmath或任何其他模块,您可以按照建议尝试多项式近似。
其中 Rn 是拉格朗日剩余
请注意,只要 x 离开中心 x 0 , Rn 就会快速增长,所以在尝试计算任意的 sin(x)或 cos(x)时,小心使用 Maclaurin系列(泰勒系列中心为0) x 。
答案 2 :(得分:2)
试试这个
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)