我试图理解我如何通过理论找到谐波序列求和的单精度。我有一个粗略的想法,例如,求和是ln(k)k是迭代步骤我想?机器epsilion是2 ^ -23。但我得到N> 2 ^ -18,但我在matlab之后得到的步骤是2097153.帮助任何人?非常感谢
答案 0 :(得分:0)
我们来看看这个简单的代码:
s=single(0);
ix=1;
while(true)
s_new=s+1/ix;
if s_new==s
break
end
s=s_new;
ix=ix+1;
end
它停在ix=2097152
,问题是为什么?
您可以添加到s_new
而不更改值的最大值为eps(s_new)/2
,因此我们正在寻找1/ix==eps(s_new)/2
的点。如果您使用已知的近似值s_new
替换log(ix+1)
,则最终得到1/ix==eps(single(log(ix+1)))/2
,这对于使用代码评估的ix来说是正确的:
>> f=@(x)(vpa(eps(single(log(x+1))))/2)-(1/vpa(x));
>> f(ix)
ans =
0.0
>> f(ix+1)
ans =
0.00000000000022737356702306650969194903757618
>> f(ix-1)
ans =
-0.00000000000022737378386350100684213964564307