Bug or is it me?
Rogelio Nodal
rnodal at verizon.net
Sun Oct 30 04:04:32 UTC 2005
Mike Bird wrote:
>On Sat, 2005-10-29 at 19:28, Rogelio Nodal wrote:
>
>
>>Hello List:
>>
>> Is this a bug?Or is it me?
>>
>> [code]
>>
>> /* Created by Anjuta version 1.2.4 */
>> /* This file will not be overwritten */
>>
>> #include <iostream>
>> #include <fstream>
>>
>> using namespace std;
>>
>> int main()
>> {
>>
>>
>>
>> double x = 0;
>>
>>
>> x = -2.3;
>> while(x <= 2.1)
>> {
>> cout << x << endl;
>> x += 0.1;
>> }
>>
>> return (0);
>> }
>>
>> [code]
>>
>>
>> When I run this little program I get the following output:
>>
>>
>> -2.3
>>-2.2
>>-2.1
>>-2
>>-1.9
>>-1.8
>>-1.7
>>-1.6
>>-1.5
>>-1.4
>>-1.3
>>-1.2
>>-1.1
>>-1
>>-0.9
>>-0.8
>>-0.7
>>-0.6
>>-0.5
>>-0.4
>>-0.3
>>-0.2
>>-0.1
>>1.082e-15 ===> What the hell?
>>0.1
>>0.2
>>0.3
>>0.4
>>0.5
>>0.6
>>0.7
>>0.8
>>0.9
>>1
>>1.1
>>1.2
>>1.3
>>1.4
>>1.5
>>1.6
>>1.7
>>1.8
>>1.9
>>2 === Why did it stop here?It is supposed to stop at 2.1.
>>
>>
>>
>>Thanks a lot for your time.
>>
>>
>> Rogelio.
>>
>>
>
>Computers work in binary. You can't represent 0.1 perfectly in
>a normal binary float or double. (There are special techniques
>but they're beyond this discussion.)
>
>So none of the numbers you're working with are accurate. They're
>all off by a microscopic amount.
>
>The errors are usually so small that the print program ignores
>them and just prints the nearest interesting number. Instead of
>-2.3000000000001 or -2.2999999999 it prints -2.3. However, once
>you counted down to zero, all that was left was the microscopic
>error part, so the print program printed that: 1.082e-15 which
>is 0.000000000000001082.
>
>When it got to the end of the loop it had 2.1 plus a microscopic
>amount. Now 2.1 plus a microscopic amount is NOT <= 2.1, so it
>stopped without printing that value near 2.1.
>
>You really don't want to be using floats or doubles as loop
>counters. There are nasty gotchas. If you need to print those
>numbers, try something like this:
>
> for (int x10 = -23; x10 <= 21; ++x10)
> cout << (x10 * 0.1) << endl;
>
>--Mike Bird
>
>
>
>
Wow. Thanks a lot for your answer. That really explains a lot. Thanks.
-Rogelio.
More information about the ubuntu-users
mailing list