[erlang-questions] erlang float comparison

Angel J. Alvarez Miguel <>
Wed May 16 15:20:09 CEST 2012


Hi

While presenting this "case"  these days we also have changed some other code so 
 (right now) we are.. ah... unable to reproduce such scenario properly,  im rechecking 
the whole thing (i said we dont have any versioning system?) 

Also, asking my workmate about this, results also in some vague memories about acos 
failing on a number around 1.0-e8 still we can detail exactly what the number was.. d'oh

So we stated to log all runs after this fiasco in order to honor with real data our (future) claims...

a few quick checks confirm that you all are right while by all means i must be wrong...

so I must state that there isnt erlang fault nor ieee floats...

...in the end is probably my fault,  we messed up something, i agree it is rather dificult to find 
such values passing the test but failing the acos fun. 

But after all and being unsure about floating point behaviour (its probably the first time I try to work 
on such numerical thing after many years of boring sysadmin shell scripting...) that i wrote this 
on the list....

Sorry for bothering you all, nevertheless, such coverage is one of the things i really appreciate, 
every time the list machinery starts growling, we (me) learn a lot of pretty interesting things..


/Angel


On Miércoles, 16 de Mayo de 2012 00:43:40 usted escribió:
> On 15/05/2012, at 9:04 PM, Angel J. Alvarez Miguel wrote:
> > The problem can be stated as:
> > 
> > Result = case Myfloat > 1.0 of
> > 
> > 	true -> 1.0;
> > 	false MyFloat
> > 	end
> > 
> > ...
> > ...
> > math:acos(Result).
> > 
> > after that  we came across some values that fail to pass the test > 1.0
> > but are seen as greater to the math:acos function rendering a bad
> > arithmetic expression error
> 
> That is pretty astonishing, actually.
> The obvious question is *what are these values*?
> I've just written a test loop searching for such
> values and so far haven't found any.
> 
> Is there any difference between emulated and native code?
> Why aren't you worried about Myfloat < -1.0?
> 
> By the way, this seems a rather strange way to write
> 
> 	Result = if Myfloat > 1.0 -> 1.0 ; true -> Myfloat end
> 
> Do you know what trig library your copy of Erlang was linked
> with?  Here's the relevant code from fdlibm:
> 
>     hx = __HI(x);
>     ix = hx & 0x7fffffff;
>     if (ix >= 0x3ff00000) {     /* |x| >= 1 */
>         if (((ix - 0x3ff00000) | __LO(x)) == 0) {       /* |x|==1 */
>             if (hx > 0)
>                 return 0.0;     /* acos(1) = 0  */
>             else
>                 return pi + 2.0 * pio2_lo;      /* acos(-1)= pi */
>         }
>         return (x - x) / (x - x);       /* acos(|x|>1) is NaN */
>     }
> 
> There's no way _that_ could claim an IEEE double was greater
> than 1.0 if it wasn't.

-- 
-



More information about the erlang-questions mailing list