Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
Home
DiscussionsAccessExcelInfoPathOutlookPowerPointPublisherWord
DirectoryUser Groups
Related Topics
Outlook ExpressInternet ExplorerWindowsMS Server ProductsMore Topics ...

MS Office Forum / Excel / Programming / May 2008

Tip: Looking for answers? Try searching our database.

for loop with step increment of 0.1

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
choi4u - 16 May 2008 14:33 GMT
Running this code
   Sub test()
       For i = 1.5 To 2 Step 0.1
           Debug.Print i
       Next i
   End Sub

gives this output
    1.5
    1.6
    1.7
    1.8
    1.9 .

Why does the output not include 2.0?
and what do I have to do to make the output include 2.0?

Thanks in advance.
Don Guillett - 16 May 2008 14:52 GMT
2.1

Signature

Don Guillett
Microsoft MVP Excel
SalesAid Software
dguillett1@austin.rr.com

> Running this code
>    Sub test()
[quoted text clipped - 14 lines]
>
> Thanks in advance.
Gary''s Student - 16 May 2008 14:55 GMT
Sub test()
       For i = 1.5 To 2.01 Step 0.1
           Debug.Print i
       Next i
   End Sub

Signature

Gary''s Student - gsnu2007h

Mike H - 16 May 2008 15:05 GMT
To add to thos ecomments try this

Sub test()
 Dim i As Single
       For i = 1.5 To 2 Step 0.1
       p = i + 0.1 > 2
           Debug.Print i
           Debug.Print p
       Next i
   End Sub

As you will note as soon as i = 1.9 then i + 0.1 is greater than 2 (True) so
it never executes.

Mike

> Running this code
>     Sub test()
[quoted text clipped - 14 lines]
>
> Thanks in advance.
Dave Peterson - 16 May 2008 15:12 GMT
I'd guess that there was an internal rounding problem that you got hit with.

I'd use:

   Sub test()
       Dim i As Long
       For i = 15 To 20 Step 1
           Debug.Print i / 10
       Next i
   End Sub

> Running this code
>     Sub test()
[quoted text clipped - 14 lines]
>
> Thanks in advance.

Signature

Dave Peterson

Rick Rothstein (MVP - VB) - 16 May 2008 15:13 GMT
The problem has to do with floating point representation and the inability
of VB (actually, any language) of being able to store all fractions in a
given integer data type (the problem is akin to the decimal representation
of 2/3, a decimal point followed by an unending string of 6's, invariably
the number is written as a fixed number of 6's followed by an ending 7)...
whatever has accumulated in the loop variable "i" at the 1.9 stage, adding
0.1 to it gives a number ever so slightly greater than 2 which is outside of
the ending loop limit, hence the loop ends at the 1.9 value. The way around
this problem is to not use floating point numbers. For example...

   Sub test()
       For i = 15 To 20
           Debug.Print i / 10
       Next i
   End Sub

(note the modified loop limits) where whenever you would have used "i" in
your original loop code, you would use "i/10" instead.

Rick

> Running this code
>    Sub test()
[quoted text clipped - 14 lines]
>
> Thanks in advance.
Rick Rothstein (MVP - VB) - 16 May 2008 15:22 GMT
Here are some links to WebPages that will show you the problem in more
detail...

INFO: Visual Basic and Arithmetic Precision
http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/s
upport/kb/articles/Q279/7/55.ASP&NoWebContent=1


(Complete) Tutorial to Understand IEEE Floating-Point Errors
http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/s
upport/kb/articles/Q42/9/80.ASP&NoWebContent=1


What Every Computer Scientist Should Know About Floating Point
http://docs.sun.com/source/806-3568/ncg_goldberg.html

Rick

> The problem has to do with floating point representation and the inability
> of VB (actually, any language) of being able to store all fractions in a
[quoted text clipped - 35 lines]
>>
>> Thanks in advance.
T Lavedas - 16 May 2008 15:22 GMT
> Running this code
>     Sub test()
[quoted text clipped - 14 lines]
>
> Thanks in advance.

It's due to the age old binary to decimal conversion problem.
Computers use binary representations of real numbers that often (most
often) do not convert exactly to their decimal equivalents without
some remainder.  This leads to the commonly occurring problem that you
see here.

As Dan Guillett suggested, one workaround is simply increase the end
value to compensate for the error, though I might use 2.01 to keep
from confusing the issue more - that is, "Why isn't 2.1 in the list?"
Another approach might be to convert the loop from a FOR to a Do Until
with a Round function to correct for the error ...

Sub test()
step = 0.1
i = 1.5
Do Until i > 2
 Debug.Print i
 i = Round(i + step, 1)
Loop
End Sub

Another way that would work is to round the index in the FOR loop ...

   Sub test()
       For i = 1.5 To 2 Step 0.1
           Debug.Print i
           i = Round(i, 1)
       Next i
   End Sub

Tom Lavedas
===========
http://members.cox.net/tglbatch/wsh/
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.