2017-07-18 13 views
3

質問はかなりわかりやすいです。私はpiの例をいくつか見てきましたが、trigo関数の例は見ていません。おそらく1つはテイラーシリーズas done hereを使用することができますが、私はそれをどのようにPythonで実装するのか完全にはわかりません。特に多くの桁を格納する方法。 私は言及する必要があります:これは、理想的には、バニラのpythonすなわちnumpy等で実行されます。Python:最大100万桁の正弦/余弦を計算する

ありがとう!

編集:うわー、私は気づいていなかったここの人々はとても自己することができます:私は質問をする前に頼まれているが、それはJavaでだと私はPythonの実装を探していました:)

編集2知って、言ったように - 吸収された。私はいくつかのアプローチを試しましたが、うまくいかないでしょう。私はこれがあなたがアドバイスを求めることができる場所だと思った、私が間違っていたと推測する

最後に編集:これは役に立つかもしれない人のために:多くの角度はsqrt(2)、sqrt(3)ここでは(1.61803 ...)これらの数字は、10mio桁の精度を上にして、広く利用されているので、それはファイルでそれらを持っていると便利ですし、あなたのプログラムでそれらを読んで直接

+1

を試してみてください。 –

+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または示唆したように、あなたが多項式近似を試みることができる他のモジュールをインストールすることができませんでした場合。 RnのRnのが速いとすぐ X として遠ざかるセンターX 0から成長するラグランジュ剰余

enter image description here

注意です

enter image description here

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に変更することはあまり難しくありません。

EDIT:実際のプリントアウトより小数点以下の順の最後の行のフォーマットで

を追加しました。

+0

OverflowError:long intが大きすぎて、0〜500の範囲でコードを試してもfloatに変換できない:( –

0

あなたは `decimal`モジュールをチェックする必要があります。この

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)