我的作业是编写一个代码,其中包含一个计算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
答案 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来计算大型因子。