当我有大量输入时,我的代码以 OverflowError 结尾

my code ends with OverflowError when I have large inputs

我的一道作业题,只能导入pi

题目要求通过泰勒级数计算余弦函数,我目前已经完成了。我得到的输出是正确的,但是当 k 大于 90 时,我得到 OverflowError: int too large to convert to float.

from math import pi

def myCos(angle,k):
    total=0
    for i in range(k):
        total += (((-1)**(i))*((angle*pi/180)**(2*(i))))/(fact(2*(i)))
    return total

def fact(n):
    if n == 0:
        return 1
    else:
        return fact(n-1)*n

为了这道题得满分,代码必须接受k > 100。

myCos(45,5)
0.7071068056832942

myCos(45,60)
0.7071067811865475

myCos(45,90)
total += (((-1)**(i))*((angle*pi/180)**(2*(i))))/(fact(2*(i)))
OverflowError: int too large to convert to float

有人可以请教我这个吗?

您在总和中的主要除法超出了float类型的范围。要进行除法,您必须将分母转换为类型 floatfact(2*85) 大于最大 float 值。

以不同的顺序进行操作。例如:

numer = (angle*pi/180)**(2*(i))
for denom in range(1, 2*i + 1):
    numer /= denom

现在 numer 是所需值的合理 (?) 表示。如果您需要更好的可靠性,"chunk" 分母值除以 10 组 denom 值的乘积。

def myCos(angle,k):
    total=0
    for i in range(k):
        numer = (angle*pi/180)**(2*(i))
        for denom in range(2, 2*i+1):
            numer /= denom
        total += (-1) ** i * numer
    return total

print(myCos(45,5))
print(myCos(45,60))
print(myCos(45,90))

输出:

0.7071068056832942
0.7071067811865475
0.7071067811865475