FOR...NEXT with Floating-Point Counter May Not Execute Fully (42469)



The information in this article applies to:

  • Microsoft QuickBASIC 4.0
  • Microsoft QuickBASIC 4.0b
  • Microsoft QuickBASIC 4.5
  • Microsoft BASIC Compiler for MS-DOS and OS/2 6.0
  • Microsoft BASIC Compiler for MS-DOS and OS/2 6.0b
  • Microsoft Basic Professional Development System (PDS) for MS-DOS and MS OS/2 7.0

This article was previously published under Q42469

SUMMARY

Because of the nature of the IEEE floating-point format, using a floating-point counter (single or double precision) in a FOR NEXT loop can result in the loop being executed one fewer time than anticipated. Using an integer or long integer instead of floating point for the loop counter is the only way to guarantee that all iterations will execute.

This information applies to Microsoft QuickBasic Versions 4.00, 4.00b, and 4.50 for MS-DOS, to Microsoft Basic Compiler Versions 6.00 and 6.00b for MS-DOS and MS OS/2, and to Microsoft Basic PDS Version 7.00 for MS-DOS and MS OS/2.

MORE INFORMATION

The following is an example:
   DEFSNG A-Z
   FOR x = 0 to .8 step .2
     PRINT x" ";
   NEXT x
				
This will generate the following results:

0 .2 .4 .600000000000001

Note that due to the rounding error in the fourth value, the loop counter will be greater than .8 on the next iteration, and the loop will execute only four times instead of the expected five times.

This IEEE rounding behavior occurs in Microsoft QuickBasic Versions 4.00, 4.00b, and 4.50, in the Basic compiler Versions 6.00 and 6.00b, and in Basic PDS 7.00.

In most cases, the rounding differences will be minimal when the variables and numbers involved are double precision. Changing the first line of the example program to the following will allow the loop to properly execute five times:
   DEFDBL A-Z
				

Modification Type:MinorLast Reviewed:1/8/2003
Keywords:KB42469