python - 当我有大量输入时,我的代码以 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
有人可以请教我吗?
解决方案
您在总和中的主要部门超出了 type 的范围float
。要进行除法,您必须将分母转换为 type float
。 fact(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
推荐阅读
- plantuml - 是否可以使用 Salt 在网格中嵌入复选框
- java - 在 Netbeans 中成功发送通知后如何获得 Firebase 响应?
- node.js - 定义变量时无法读取未定义的属性“查找”
- typescript - ngrx - for 循环 - 完成当前元素的处理后获取下一个元素
- c++ - 在函数和线程安全中使用静态变量时的隐藏分支
- keras - 克隆使用 lambda 层和 Keras 中用户定义函数的模型时找不到函数
- python - 在 Azure Web Apps 中设置 Python 服务器
- javascript - 如何使用node js检查文件中有多少行代码
- php - 如何在codeigniter中显示应用于电子商务网站中产品的过滤器数量?
- c++ - VS Code C++ program does not display any output while debugging