Python:计算正弦/余弦,精度高达100万位

时间:2017-07-18 14:28:14

标签: python sine

问题非常明显。我已经看过pi的几个例子,但没有看到trigo函数。也许有人可以使用泰勒系列as done here,但我并不完全确定如何在python中实现它。特别是如何存储这么多数字。 我应该提一下:理想情况下,这将在vanilla python上运行,即没有numpy等。

谢谢!

编辑:如上所述,我知道之前已经问过这个问题,但是在java中我正在寻找一个python实现:)

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

最后编辑:对于任何可能发现这个有用的人:许多角度可以计算为sqrt(2),sqrt(3)和Phi(1.61803 ..)的倍数。因为这些数字可以广泛使用,精度高达10十位数字,将它们放入文件并直接在程序中读取它们非常有用

3 个答案:

答案 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或任何其他模块,您可以按照建议尝试多项式近似。

enter image description here

其中 Rn 拉格朗日剩余

enter image description here

请注意,只要 x 离开中心 x 0 Rn 就会快速增长,所以在尝试计算任意的 sin(x) cos(x)时,小心使用 Maclaurin系列(泰勒系列中心为0) x

Bad idea: infinity does not exist in computers

Bad idea: infinity does not exist in computers

答案 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)