MATLAB中for循环和while循环,当步进为小数时为什么得到的结果不一致

MATLAB中for循环和while循环,当步进为小数时得到的结果不一致。

%%
clc; close all;
% for循环,整数步进
sum=0;
for n=1:1:2
   sum=sum+1;
end
fprintf('\n[for] step by int, sum=%d, n=%d\n', sum, n);

% while循环,整数步进
sum=0;
n=1;
while n<=2
   sum=sum+1;
   n=n+1;
end
fprintf('\n[while] step by int, sum=%d, n=%d\n', sum, n);

% for循环,小数步进
sum=0;
for n=1:0.1:2
   sum=sum+1;
end
fprintf('\n[for] step by double, sum=%f, n=%f\n', sum, n);

% while循环,小数步进
sum=0;
n=1;
while n<=2
   sum=sum+1;
   n=n+0.1;
end
fprintf('\n[while] step by double, sum=%f, n=%f\n', sum, n);

输出结果:



[for] step by int, sum=2, n=2

[while] step by int, sum=2, n=3

[for] step by double, sum=11.000000, n=2.000000

[while] step by double, sum=10.000000, n=2.000000

要找到问题很简单,你令迭代完成后n-2的取值都显示在命令行,代码如下:

%% 相关参数设置
%%
clc; close all;
% for循环,整数步进
sum=0;
for n=1:1:2
    sum=sum+1;
end
fprintf('\n[for] step by int, sum=%d, n=%d\n', sum, n);

% while循环,整数步进
sum=0;
n=1;
while n<=2
    sum=sum+1;
    n=n+1;
end
fprintf('\n[while] step by int, sum=%d, n=%d\n', sum, n);

% for循环,小数步进
sum=0;
for n=1:0.1:2
    sum=sum+1;
end
fprintf('\n[for] step by double, sum=%f, n=%f\n', sum, n);
n-2
% while循环,小数步进
sum=0;
n=1;
while n<=2
    sum=sum+1;
    n=n+0.1;
end
n-2
fprintf('\n[while] step by double, sum=%f, n=%f\n', sum, n);

运行结果:

[for] step by int, sum=2, n=2

[while] step by int, sum=2, n=3

[for] step by double, sum=11.000000, n=2.000000

ans =

     0


ans =

   8.8818e-16


[while] step by double, sum=10.000000, n=2.000000

结果显示while循环出现了数值精度问题(matlab中最小能识别的数为eps=2.2204e-16),也就是每次小数计算时会有误差,误差可能多了也可能少了2.2204e-16,多次累计下来就导致最终结果超过了2。
有用希望可以采纳一下哈!

【以下回答由 GPT 生成】

问题解答:

在MATLAB中,当步进为小数时,使用for循环和while循环得到的结果不一致的原因是由于浮点数运算的精度问题。在计算机中,浮点数的精度是有限的,所以在计算过程中会存在舍入误差。这个误差会导致计算过程中的逼近值与实际值之间有一定的差异,从而导致结果的不一致。

具体来说,在给定的代码示例中,当步进为小数时:

  1. for循环:当步进为小数时,for循环的结束条件可能会因为舍入误差而无法满足,导致循环没有正常终止。在循环的每一次迭代中,n的值都会在不精确的步进大小下递增。当n递增到大于2的值时,循环终止。由于舍入误差的影响,循环可能会多迭代一次或者少迭代一次,导致最终结果的不一致。

  2. while循环:同样地,当步进为小数时,while循环的结束条件也可能会因为舍入误差而无法满足,导致循环没有正常终止。在每次迭代中,n的值都会递增一个小数步进。由于舍入误差的影响,当n递增到大于2的值时,循环可能会多迭代一次或者少迭代一次,导致最终结果的不一致。

要解决这个问题,可以考虑以下几种方案:

  1. 使用整数步进代替小数步进:如果步进值对结果没有特殊的要求,可以尝试使用整数步进代替小数步进。由于整数的表示精度更高,因此使用整数步进可能能够得到更准确的结果。
sum = 0;
for n = 1:1:20
   sum = sum + 1;
end
fprintf('\n[for] step by int, sum=%d, n=%d\n', sum, n);
  1. 使用round或fix函数进行取整:在循环过程中,可以在每次迭代后使用round或fix函数对n进行取整,以保证n的值在每次迭代后是精确的。这样可以避免舍入误差的累积。
sum = 0;
n = 1;
while n<=2
   sum = sum + 1;
   n = n + 0.1;
   n = round(n, 1);  % or n = fix(n*10)/10;
end
fprintf('\n[while] step by double, sum=%f, n=%f\n', sum, n);
  1. 设置一个终止条件:在for循环和while循环中,可以设置一个终止条件来保证循环的终止。例如,在for循环中可以使用if语句来检查n是否已经超过了终止条件,如果超过则退出循环。在while循环中,可以使用类似的方式检查n是否已经超过了终止条件,如果超过则退出循环。
sum = 0;
for n = 1:0.1:2
   if n > 2
       break;
   end
   sum = sum + 1;
end
fprintf('\n[for] step by double with termination condition, sum=%f, n=%f\n', sum, n);

总结一下,当步进为小数时,由于浮点数的精度问题,for循环和while循环得到的结果可能会不一致。为了解决这个问题,可以尝试使用整数步进,使用取整函数进行精确的计算,或者设置一个终止条件来保证循环的终止。希望以上解决方案对您有帮助!如果还有任何问题,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^