1

代码编译但输出错误。例如,当我输入一个值 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                
4

3 回答 3

1

您在每个循环中将总和设置为零:sum=0应该在 for 循环之前,而不是在其中。

于 2016-02-26T01:54:15.957 回答
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”),这也将起作用。

NB 角度值越高,serie 收敛所需的时间越长(即给出正确答案)。由于您只迭代 9 次,因此对于较大的角度值,它可能给出不准确的答案。通常的技巧是保留 sum 的最后一个值,并在它不改变时停止迭代。

NB2:您可以通过避免重新计算y**(2*i))factorial(2*i). 您可以保留以前的值,例如,如果您计算了 8 的阶乘,只需乘以 9 再乘以 10 即可获得 10 的阶乘。同样,如果您计算y**10,只需将其乘以y*y得到y**12

于 2016-02-26T02:05:09.437 回答
0

就像 Chris 说的,sum=0应该在 for 循环之前。这是一个更干净的代码:

def cos(x):
    return sum(((-1)**(i)) * (y **(2* i))/factorial((2*i)) for i in range(9))
于 2016-02-26T01:57:16.990 回答