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循环得到的结果不一致的原因是由于浮点数运算的精度问题。在计算机中,浮点数的精度是有限的,所以在计算过程中会存在舍入误差。这个误差会导致计算过程中的逼近值与实际值之间有一定的差异,从而导致结果的不一致。
具体来说,在给定的代码示例中,当步进为小数时:
for循环:当步进为小数时,for循环的结束条件可能会因为舍入误差而无法满足,导致循环没有正常终止。在循环的每一次迭代中,n的值都会在不精确的步进大小下递增。当n递增到大于2的值时,循环终止。由于舍入误差的影响,循环可能会多迭代一次或者少迭代一次,导致最终结果的不一致。
while循环:同样地,当步进为小数时,while循环的结束条件也可能会因为舍入误差而无法满足,导致循环没有正常终止。在每次迭代中,n的值都会递增一个小数步进。由于舍入误差的影响,当n递增到大于2的值时,循环可能会多迭代一次或者少迭代一次,导致最终结果的不一致。
要解决这个问题,可以考虑以下几种方案:
sum = 0;
for n = 1:1:20
sum = sum + 1;
end
fprintf('\n[for] step by int, sum=%d, n=%d\n', sum, 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);
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循环得到的结果可能会不一致。为了解决这个问题,可以尝试使用整数步进,使用取整函数进行精确的计算,或者设置一个终止条件来保证循环的终止。希望以上解决方案对您有帮助!如果还有任何问题,请随时提问。
【相关推荐】