用python中的循环计算无穷级数
我希望为计算以下无穷级数的函数编写代码: 汇聚到sinx。我编写了获取x值的代码:用python中的循环计算无穷级数,python,Python,我希望为计算以下无穷级数的函数编写代码: 汇聚到sinx。我编写了获取x值的代码: import math def zero_to_infinity(): i = 0 while True: yield i i += 1 def CalcMYSeries(x): res, temp = 0, 0 for i in zero_to_infinity(): res += (((-1)**i)*(x**(2*i+1))
import math
def zero_to_infinity():
i = 0
while True:
yield i
i += 1
def CalcMYSeries(x):
res, temp = 0, 0
for i in zero_to_infinity():
res += (((-1)**i)*(x**(2*i+1)))/math.factorial(2*i+1)
if res == temp:
break
temp = res
return res
该代码适用于较小的值,例如10、20。然而对于较大的值,它会生成错误的数字。以下是输出的示例:
>> CalcMYSeries(10): -0.54402111088927
>> sin(10) = -0.5440211108893698
>> CalcMYSeries(40): -3.282209134433358
>> sin(40) = 0.7451131604793488
为什么输出的行为如此?在用较大的数字进行计算时是否省略了位?不是我所说的,而是。浮点具有有限的精度,在某一点之后,您的计算开始受到二进制表示的不精确性的影响
使用内置的十进制模块处理需要保持精确的非常小的分数。当x==40,i==17时
(((-1)**i)*(x**(2*i+1)))/math.factorial(2*i+1)==-1.1425285155674632e+16
(((-1)**i)*(x**(2*i+1)))/math.factorial(2*i+1)==-4710083405001725.0
当x==39,i==17时
(((-1)**i)*(x**(2*i+1)))/math.factorial(2*i+1)==-1.1425285155674632e+16
(((-1)**i)*(x**(2*i+1)))/math.factorial(2*i+1)==-4710083405001725.0
因此,当x>39时,计算中的数字太大,浮点数失去了足够的精度,无法用于后续步骤。明白了。你有什么建议?