在教学过程中,学生用循环结构编写求解S=1.1+2.2+3.3+4.4+5.5+6.6+7.7+8.8+9.9+11.0的计算程序,用了以下两种形式:
程序1
10 S=0
20 FOR I=1 TO 10
30 READ A
40 S=S+A
50 NEXT I
60 PRINT“S=”;S
80 DATA1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,11
RUN
S=60.5
程序2
10 S=0
20 FOR I=1.1 TO 11 STEP 1.1
30 G=S+I
40 NEXT I
50 PRINT“S=”;S
RUN
S=49.5
其中,程序1的运行结果是正确的,程序2的结果则是错误的。而程序2的编程方法并没有错,问题出在哪里呢?
为了说明问题,我们先在程序2中插入25行(见程序3),并运行之。
程序3
10 S=0
20 FOR I=1.1 TO 11 S TEP 1.1
25 PRINT“I=”;I,
30 S=S+I
40 NEXT I
50 PRINT“S=”;S
RUN
I=1.1 I=2.2 I=3.3
I=4.4 I=5.5 I=6.6
I=7.7 I=8.8 I=9.90000;
S=49.5
程序4
10 S=0
20 FOR I=1.1 TO 11 STEP 1.1
30 S=S+I
35 I=INT(I*10+0.1)/10
40 NEXT I
50 PRINT“S=”,S
RUN
S=60.5
很明显,循环到第9次时,循环变量I出现了正误差(I=9.900001),按照NEXT的执行过程,此时要用现有的I值(9.900001)再加上一个步长值(1.1),而后与终值进行比较。比较结果,I值超越了终值(11),程序便跳出循环,故得S=49.5。如将步长值减小(如改为0.2)运行程序,则I的输出值中将会同时出现正误差和负误差。究其原因,主要是由于机器采用二进制运算(浮点运算)而采用十进制显示所致。因此,用带小数的循环变量参与循环体内的计算时,必须采取某些对策才能使计算结果正确。这个对策是:在NEXT I语句前用取整函数先对I值的误差进行消除(见程序4中35行),即在取整前加上一个不影响!值精度的小数(本例取0.1)然后再运行程度4,共结果完全正确。(赵明星)