首页 > 解决方案 > 当我有大量输入时,我的代码以 OverflowError 结尾

问题描述

我的作业问题之一,我只被允许导入 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。

IE

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

有人可以请教我吗?

标签: pythontrigonometry

解决方案


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

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

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

现在numer是所需值的合理 (?) 表示。如果您需要更好的可靠性,请将分母值“分块”并除以例如 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

推荐阅读