我的作业是写一个代码,其中包含一个函数,计算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
我很惊讶这是一个问题,因为我认为
r
在成为问题之前就已经低于了错误容忍度。你知道吗请注意,您真正需要的是阶乘的倒数。你可以有一个变量,比如
fact_recip
,初始化为像
r= ex*sign*fact_recp
一样使用并通过
这将处理您看到的错误,但我不确定舍入错误是否是一个问题。你知道吗
正如@John Coleman所建议的,你可以用一个引导性问题和一个分割来处理你的输入,尽管我会两人一组做作业:
下面是清理程序:因子更新,特别是阶乘,从上一项减少到变化。我还规范了你的循环限制,以便更具可读性。你知道吗
我不知道你说的是什么意思
while循环的条件看起来很奇怪,但是正如R Nar指出的,错误是由
factorial
的值变得太大引起的。我不建议使用decimal
,因为它非常慢。不如看一下gmpy,它是为了获得(真正)快速的任意精度数学而构建的。你知道吗或者可以使用Strinling's Approximation来计算大阶乘。你知道吗
相关问题 更多 >
编程相关推荐