2016-02-26 98 views
1

代碼編譯但輸出錯誤。例如,當我輸入45的值時,輸出爲1.0。我使用enthought canopy IDE,我哪裏出錯了?餘弦x的泰勒級數在運行時使用python提供邏輯錯誤

import math 
x = int(raw_input("Enter the size of the angle : ")) 
y = (x*math.pi)/180 

# my factorial function 
def factorial(n): 
    if n == 0 or n == 1: 
    return 1 
    else: 
    return n * factorial(n - 1) 
def cos(x): 
    for i in range (9): 
    sum = 0 
    sum += ((-1)**(i)) * (y **(2* i))/factorial((2*i)) 
    return sum  

print cos(x) 
print y # I wanted to be sure my conversion to radian is right     
+1

你應該把sum = 0放在循環之外。 – GAVD

回答

1

您在每個循環中將總和設回零:sum=0應該在for循環之前,而不是在循環中。

0

像Chris說的那樣,sum=0應該在for循環之前。這裏有一個更清晰的代碼:

def cos(x): 
    return sum(((-1)**(i)) * (y **(2* i))/factorial((2*i)) for i in range(9)) 
+0

它現在給我正確的輸出,當我糾正它 –

+0

並計算factorial你可以使用python的'math.factorial(n)'或編寫自己的函數:'def factorial(n):return reduce(lambda x,y: X * Y,[1] +範圍(1,N + 1))' –

0

問題是您的程序使用整數而不是浮點數。此外,變量sum應該在循環之前初始化。

import math 
x = float(raw_input("Enter the size of the angle : ")) 
y = (x*math.pi)/180.0 

#my factorial function 
def factorial(n): 
    if n == 0 or n == 1: 
     return 1 
    else: 
     return n * factorial(n - 1) 
def cos(x): 
    sum = 0.0 
    for i in range (9): 
    sum += ((-1)**(i)) * (y **(2*i))/factorial((2*i)) 
    return sum  
print cos(x) 
print y 

即使爲角度輸入「45」(不帶「.0」),這也可以工作。

N.B.角度值越高,系列收斂花費的時間越長(即給出正確的答案)。由於您只重複9次,因此可能會給出大角度值的不準確答案。通常的技巧是保持sum的最後一個值,並在不改變時停止迭代。

N.B.2:您可以通過避免重新計算y**(2*i))factorial(2*i)來優化程序。例如,如果計算8的階乘,只需乘以9,10乘以10的階乘即可。例如,如果您計算y**10,只需乘以y*y即可獲得y**12