搜索我写的计算泰勒级数的错误代码

2024-09-28 23:28:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

Tags: 函数数字mathusersexfilesumprint
3条回答

我很惊讶这是一个问题,因为我认为r在成为问题之前就已经低于了错误容忍度。你知道吗

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

fact_recip = 1.0

r= ex*sign*fact_recp一样使用

并通过

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

这将处理您看到的错误,但我不确定舍入错误是否是一个问题。你知道吗

正如@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))

我不知道你说的是什么意思

if i set amount of r larger than this (i.e 0.1)

while循环的条件看起来很奇怪,但是正如R Nar指出的,错误是由factorial的值变得太大引起的。我不建议使用decimal,因为它非常慢。不如看一下gmpy,它是为了获得(真正)快速的任意精度数学而构建的。你知道吗

或者可以使用Strinling's Approximation来计算大阶乘。你知道吗

相关问题 更多 >