我希望为计算以下无限级数的函数创建代码:
收敛于“sin(x)”。我编写了获取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)))/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
为什么输出表现如此?在用更大的数字进行计算时是否省略了比特?
答案 0 :(得分:1)
不是我怎么说的,但是是的。浮点数具有有限的精度,在某一点之后,您的计算开始受到二进制表示的不精确性的影响。
使用内置的Decimal模块处理需要保持精确的非常小的分数。
答案 1 :(得分:0)
当x == 40且i == 17时,
(((-1)**i)*(x**(2*i+1)))/math.factorial(2*i+1)==-1.1425285155674632e+16
当x == 39且i == 17时,
(((-1)**i)*(x**(2*i+1)))/math.factorial(2*i+1)==-4710083405001725.0
所以,当x> 39,计算中的数字太大,浮点数对后续步骤的精度损失不足。