搜索我编写的代码错误来计算泰勒系列

时间:2015-11-09 18:55:09

标签: python

我的作业是编写一个代码,其中包含一个计算sinx泰勒系列并返回金额的函数。 函数必须得到(n,k),其中n是正弦的请求数,k是函数必须在点后计算的数字。 首先我忽略了k因为它很容易限制点之后的数字,并编写了一个函数来计算sinx taylor,所以我给它一个特定的范围r(r是泰勒系列的每个句子):

def taylor(n,k):

  s= ((math.pi)/180)*n
  ex = s
  sign = 1
  factorial = 1
  sum=0
  i=1
  r=1

  while r>0.00000000000000000001 or r<0.0000000000000000000001 :
     r= ex*sign/factorial
     ex = ex*s*s
     sign = sign*(-1)
     factorial=factorial*(i+1)*(i+2)
     i= i+2
     sum = sum + r

  return sum

import math
print(taylor(45,1))

我只是不知道为什么如果我将r的数量设置为大于此值(即0.1),我会收到此错误:

Traceback (most recent call last):

File "/Users/modern/Desktop/taylor.py", line 22, in <module>

print(taylor(45))

File "/Users/modern/Desktop/taylor.py", line 12, in taylor

r= ex*sign/factorial

OverflowError: int too large to convert to float

3 个答案:

答案 0 :(得分:3)

我很惊讶这是一个问题,因为我认为r在出现问题之前会低于容错率。

请注意,您真正需要的是阶乘的倒数。你可以有一个变量,比如fact_recip,它被初始化为

,而不是一个你除以的因子变量。
fact_recip = 1.0

r= ex*sign*fact_recp

类似

通过

更新
fact_recip /= ((i+1)*(i+2))

这将处理您看到的错误,但我不确定舍入错误是否会成为问题。

答案 1 :(得分:1)

正如@John Coleman建议的那样,你可以用一个主要问题和一个分裂来处理你的输入,虽然我会把这个任务分配成一对:

nums = input("Enter n, k, separated by a space")
n, k = nums.split()

这是清理过的程序:因子更新 - 特别是因子 - 被减少到前一个术语的变化。我还将你的循环限制册封为更易读。

def taylor(n,k):

    s = (math.pi/180)*n
    s2 = s*s
    sum = s
    i = 1
    r = s
    converge = 1.0E-20

    while r > converge or r < converge / 100 :
        r *= -s2/((i+1)*(i+2))
        sum += r
        i = i+2

    return sum

import math
print(taylor(45,1))

答案 2 :(得分:0)

我不确定你的意思

  

如果我将r的数量设定为大于此值(即0.1)

并且你的while循环的条件看起来很奇怪,但正如R Nar指出的那样,错误是由factorial的值变得过大引起的。我会建议使用decimal,因为它真的很慢。而是看一下构建的gmpy,以获得(真正)快速的任意精度数学。

或者,您可以使用Strinling's Approximation来计算大型因子。