[英]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.