2017-07-18 134 views
3

问题很明显。我见过几个pi的例子,但不是用于三角函数。也许可以使用泰勒级数as done here,但我不完全确定如何在Python中实现它。特别是如何存储这么多数字。 我应该提到:这个理想情况下会运行在香草python上,也就是没有numpy等。Python:以高达100万位的精度计算正弦/余弦

谢谢!

编辑:为说,我知道这个问题已经被问过,但它是在Java中,我一直在寻找一个Python实现:)

编辑2:哇,我不知道这里的人可以如此自已吸收。我确实尝试了几种方法,但没有一种可行。我认为这是一个你可以寻求建议的地方,你猜我错了

最后编辑:对于任何人可能会觉得这有用:许多角度可以计算为sqrt(2),sqrt(3)和Phi (1.61803 ...)因为这些数字被广泛使用具有精确到10mio数字,它是有用的,让他们在一个文件中,并在你的程序读取它们直接

+1

你应该检查'decimal'模块。 –

+0

[精确计算正弦和余弦函数]可能的副本(https://stackoverflow.com/questions/19797951/calculate-sine-and-cosine-functions-with-precision) –

+5

您是否可以展示*任何*努力实施你链接到的算法? –

回答

2

mpmath是这样的:

from mpmath import mp 
precision = 1000000 
mp.dps = precision 
mp.cos(0.1) 

如果无法安装mpmath或任何其他模块的建议你可以尝试多项式逼近。

enter image description here

其中Rn中Lagrange余

enter image description here

注意Rn中X移动远离中心X 0尽快长得快 ,尝试计算的sin(x)时要小心使用麦克劳林级数(泰勒级数在0居中)COS(x)的任意X

Bad idea: infinity does not exist in computers

Bad idea: infinity does not exist in computers

-1
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并不会太难。

编辑:

添加在最后一行的格式,以实际打印出更多的小数位。

+0

OverflowError:long int太大而无法在范围为0到500的范围内尝试代码时转换为float :( –

0

试试这个

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)