<p>首先,一些注意事项。最好在上一次打印结束时打印<code>\n</code>,或者在下一次打印的开始处打印<code>print()</code>。
使用调试工具、使用<code>logging</code>模块或仅使用<code>print</code>并通过将预期值与返回值进行比较来查找错误,这是很有用的。在</p>
<p>下面是一个对我有用的代码:</p>
<pre><code>import math
def main():
print()
print("Program to approximate sin and cos.")
print("You will be asked to enter an angle and \na number of terms.")
print("Written by ME")
print()
sinx = 0
cosx = 0
x = int(input("Enter an angle (in degrees): "))
terms = int(input("Enter the number of terms to use: "))
print()
x = x / 180.0 * math.pi; # added
for i in range(1, terms+1):
sinx = sinx + getSin(i, x)
cosx = cosx + getCos(i, x)
print("Cos:{0}, Sinus:{1}".format(cosx,sinx)); # changed
def getSin(i, x):
if i == 1:
return x
else:
num, denom = calcSinFact(i, x)
sin = float(num)/denom # changed
return sin
def getCos(i, x):
if i == 1:
return 1
else:
num, denom = calcCosFact(i, x)
cos = float(num)/denom # changed
return cos
def calcSinFact(i, x):
if i % 2 == 1:
sign = +1 # changed
if i % 2 == 0:
sign = -1 # changed
denom = math.factorial(i*2-1)
num = sign * (x**(i*2-1))
return num, denom
def calcCosFact(i, x):
if i % 2 == 1:
sign = +1 # changed
if i % 2 == 0:
sign = -1 # changed
denom = math.factorial(i*2-2) # changed
num = sign * (x**(i*2-2)) # changed
return num, denom
</code></pre>
<p>我改变了什么?(我希望我不会忘记什么)</p>
<ol>
<li>您的<code>sign</code>变量错误。恰恰相反。所以我改变了条件中的符号。在</li>
<li>这可能不是必需的,但是当您将<code>num</code>除以<code>denom</code>时,我添加了从int到float的转换。在</li>
<li>根据<a href="http://en.wikipedia.org/wiki/Taylor_series#Approximation_and_convergence" rel="nofollow">definition of the approximation</a>,输入<code>x</code>是以弧度表示的。所以我增加了从度到弧度的转换。<code>x = x / 180.0 * math.pi;</code></li>
<li>您在<code>calcCosFact</code>中的索引错误。它总是高出2。(即4代替2,8代替6…)</li>
</ol>
<p>我得到了这个结果:
输入角度(以度为单位):180输入要使用的术语数:5
成本:-0.97602221624, 窦:0.00692527070751在</p>
<p>现在应该是对的。当你需要快速计算数学时,我也可以推荐<a href="https://www.wolframalpha.com" rel="nofollow">WolphramAlpha</a>。在</p>