Using trunc function in Erlang

Richard Cameron camster@REDACTED
Fri Dec 30 19:35:58 CET 2005


On 30 Dec 2005, at 18:15, Erlang Questions wrote:

> Hello everybody, I have one question about Erlang trunc function.
>
> Why Erlang behaves like this?
>
> 1> trunc(1.3/0.1).
> 13
> 2> trunc(1.4/0.1).
> 13
> 3> trunc(1.5/0.1).
> 15

Unfortunately, this isn't an Erlang problem at all. Look at the  
output of this little C program on my machine:

wilt:/tmp rcameron$ cat floor.c
#include <math.h>
#include <stdio.h>
main() {
         printf("%f\n", floor(1.4/0.1));
}
wilt:/tmp rcameron$ gcc -o floor floor.c
wilt:/tmp rcameron$ ./floor
13.000000

Computers have a nasty habit of doing things you might not  
intuitively expect with floating point operations. You sort of just  
have to accept that float operations are not exact, so the computation:

1.4/0.1

actually produces a result in the range

14.0000000000000 +/- epsilon

where epsilon is (very) small. Unfortunately, in your case, it's  
every so slightly negative, so

erlang:trunc(14.0000000000000 - Epsilon).

evaluates to 13.

> And which you think is the best way to manage this in order to  
> solve this kind of problems?

It depends very much what you're trying to do. What do these numbers  
represent in your application?

Richard.




More information about the erlang-questions mailing list