[英]Taylor series for cosine x gives logical error at runtime using python
代碼可以編譯,但是輸出錯誤。 例如,當我輸入值45時,輸出為1.0。 我使用有思想的機蓋IDE,哪里出了問題?
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
在每個循環中將總和設置回零: sum=0
應該在for循環之前,而不是在其中。
就像克里斯說的那樣, sum=0
應該在for循環之前。 這是一個更干凈的代碼:
def cos(x):
return sum(((-1)**(i)) * (y **(2* i))/factorial((2*i)) for i in range(9))
問題在於您的程序使用整數而不是浮點數。 另外,變量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”),該設置也將起作用。
注意:角度值越高,意甲收斂的時間越長(即給出正確的答案)。 由於僅迭代9次,因此對於大角度值,它可能會給出不正確的答案。 通常的技巧是保留sum的最后一個值,並在其不變時停止迭代。
NB2:您可以通過避免重新計算y**(2*i))
和factorial(2*i)
來優化程序。 您可以保留先前的值,例如,如果您計算了8的階乘,只需乘以9和10即可得到10的階乘。以同樣的方式,如果您計算y**10
,只需將其乘以y*y
得到y**12
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.