# [erlang-questions] erlang float comparison

Richard O'Keefe <>
Wed May 16 00:43:40 CEST 2012

```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.

```