Re: floating point comparison
- To: mathgroup at smc.vnet.net
 - Subject: [mg95263] Re: floating point comparison
 - From: dh <dh at metrohm.com>
 - Date: Tue, 13 Jan 2009 07:03:16 -0500 (EST)
 - References: <gkgp8r$3vg$1@smc.vnet.net>
 
Hi Bert,
due to finite precision, it is not a good idea to accurately compare 
machine numbers. Therefore, some "grey zone" is usually defined. In Mathematica , 
from the manual:
"Approximate numbers are considered unequal if they differ beyond their 
last two decimal digit"
Now, what are the last 2 digits? Consider:
1.0 != 1.00000000000001
this gives False, both nu numbers are in agreement for digit 1..14, they 
differ in the 15. digit. Now consider:
1.0 - 1.00000000000001 != 0
this gives True because the numbers 1.0 - 1.00000000000001 and 0 already 
differ in the first digit.
hope this helps, Daniel
Bert Aerts (rm X) wrote:
> In the code shown below, the result of iterFixedPointList[Cos,0.0] in 94
> iterations is equal to FixedPointList[Cos,0.0]. The while loop comparison
> happens as newV - oldV != 0.0. However if the comparison is written as
> newV != oldV, then the there are only 82 iterations and the result is not
> the final one. Why are these 2 comparisons not equal?
> 
> Remark: machine precision numbers are best shown in 16 digits precision:
> Global Mathematica definition in Edit / Preferences : Appearance /
> Numbers / Formatting / Displayed Precision = 16 in Mathematica 7.0.0 x86_64
> on Linux
> 
> Clear[iterFixedPointList];
> iterFixedPointList[function_, initValue_] := 
>  Module[{i, oldV, newV, listV},
>   i = 1;
>   oldV = initValue;
>   newV = function[initValue];
>   listV = {oldV, newV};
>   While[newV - oldV != 0.0,
>    i++;
>    oldV = newV;
>    newV = function[newV];
>    listV = Append[listV, newV];
>    (*
>     Appending newV here already before it is tested
>    makes that the last 2 values in listV will be equal
>    *)
>    ];
>   Print["Number of iterations is ", i];
>   listV
>   ]
> 
> 
>