谐波序列的单点精度
SIngle point precsion for harmonic sequence
我想了解如何从理论上找到调和序列求和的单精度。例如,我有一个粗略的想法,总和是 ln(k),我认为 k 是迭代步骤吗?机器 epsilion 是 2^-23。但是我得到 N> 2^-18,但是我在 matlab 之后得到的步骤是 2097153。有人帮忙吗?非常感谢
我们来看这个简单的代码:
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
我想了解如何从理论上找到调和序列求和的单精度。例如,我有一个粗略的想法,总和是 ln(k),我认为 k 是迭代步骤吗?机器 epsilion 是 2^-23。但是我得到 N> 2^-18,但是我在 matlab 之后得到的步骤是 2097153。有人帮忙吗?非常感谢
我们来看这个简单的代码:
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