代码编译但输出错误。例如,当我输入值45时,我得到1.0的输出。我使用了enthought canopy 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
答案 0 :(得分:1)
在每个循环中将总和设置为零:sum=0
应该在for循环之前,而不是在for循环之前。
答案 1 :(得分:0)
像克里斯所说,sum=0
应该在for循环之前。这是一个更干净的代码:
def cos(x):
return sum(((-1)**(i)) * (y **(2* i))/factorial((2*i)) for i in range(9))
答案 2 :(得分: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
,只需乘以{ {1}}获取y*y
。