为什么 SAS 中的 DO WHILE 和 DO UNTIL 在循环应该停止后再次执行循环体?
Why DO WHILE and DO UNTIL in SAS execute the loop body one more time after the loop should be stopped?
问题 1:
对于DO WHILE,我写下了以下代码:
data do_while;
a = 0;
do while (a<1);
a = a+0.1;
output;
end;
run;
SAS 给了我这个:
result of do_while
不明白为什么输出1.1。当 a = 1 时循环不应该停止吗?
问题 2:
对于DO UNTIL,我写下了以下内容:
data do_until;
b=0;
do until (b>=1);
b=b+0.1;
output;
end;
run;
SAS 给了我这个:result of do_until
我理解 DO WHILE 循环在执行循环体之前检查条件,而 DO UNTIL 循环执行循环体然后检查条件。
当b=0.9时,SAS执行b=b+0.1(现在b=1)并输出。然后 SAS 检查条件 b>=1 是否为真,因此循环应该停止。但是为什么还是输出1.1呢?
您是正确的,因为 do while
条件是在进入循环时求值的,而 do until
是在循环结束时求值的。
问题可能归结为实数的数字表示。
在内部,当以 0.1 递增十次时,您最终得到的值可能略小于 1(例如 0.999999999989)。
将您的条件更改为
do while (round(a,0.1) < 1)
输出语句位置错误
data do_while;
a = 0;
do while (a<1);
output;
a = a+0.1;
end;
run;
问题 1: 对于DO WHILE,我写下了以下代码:
data do_while;
a = 0;
do while (a<1);
a = a+0.1;
output;
end;
run;
SAS 给了我这个: result of do_while
不明白为什么输出1.1。当 a = 1 时循环不应该停止吗?
问题 2: 对于DO UNTIL,我写下了以下内容:
data do_until;
b=0;
do until (b>=1);
b=b+0.1;
output;
end;
run;
SAS 给了我这个:result of do_until
我理解 DO WHILE 循环在执行循环体之前检查条件,而 DO UNTIL 循环执行循环体然后检查条件。
当b=0.9时,SAS执行b=b+0.1(现在b=1)并输出。然后 SAS 检查条件 b>=1 是否为真,因此循环应该停止。但是为什么还是输出1.1呢?
您是正确的,因为 do while
条件是在进入循环时求值的,而 do until
是在循环结束时求值的。
问题可能归结为实数的数字表示。
在内部,当以 0.1 递增十次时,您最终得到的值可能略小于 1(例如 0.999999999989)。
将您的条件更改为
do while (round(a,0.1) < 1)
输出语句位置错误
data do_while;
a = 0;
do while (a<1);
output;
a = a+0.1;
end;
run;