Erlang Central

Difference between revisions of "Floating Point Rounding"

From ErlangCentral Wiki

m (Reverted edits by Kaiserpanda (Talk); changed back to last version by Ayrnieu)
Line 10:Line 10:
 
floor(X) ->
 
floor(X) ->
 
     T = trunc(X),
 
     T = trunc(X),
     case X - T < 0 of
+
     case X - T == 0 of
         true -> T - 1;
+
         true -> T;
         false -> T
+
         false -> T - 1
 
     end.
 
     end.
  
 
ceiling(X) ->
 
ceiling(X) ->
 
     T = trunc(X),
 
     T = trunc(X),
     case X - T < 0 of
+
     case X - T == 0 of
 
         true -> T;
 
         true -> T;
 
         false -> T + 1
 
         false -> T + 1
Line 44:Line 44:
 
The procedures all return integers.  
 
The procedures all return integers.  
  
round/1 returns the closest integer to x, rounding to even when x is halfway between two integers.  
+
round/1 returns the closest integer to x, rounding to even when x is halfway between two integers.
 +
trunc/1 returns the integer closest to x whose absolute value is not larger than the absolute value of x.  
 
floor/1 returns the largest integer not larger than x.  
 
floor/1 returns the largest integer not larger than x.  
 
ceiling/1 returns the smallest integer not smaller than x.  
 
ceiling/1 returns the smallest integer not smaller than x.  
trunc/1 returns the integer closest to x whose absolute value is not larger than the absolute value of x.  
+
 
 +
For the floor and ceiling functions implemented above, T will always be less than or equal to X.  We just need to check if there is a difference between the two in which case we will either increase or decrease the truncation depending if we want to floor or ceiling X.
  
 
Further general information on math and rounding is available from:  
 
Further general information on math and rounding is available from:  

Revision as of 22:32, 18 January 2009

Problem

You need to round a floating-point number to an integer.

Solution

Use one of the functions round/1, ceiling/1, floor/1 and trunc/1. Note, the standard Erlang distribution does not come with either floor/1 or ceiling/1, but they can be easily implemented in terms of trunc/1

floor(X) ->
    T = trunc(X),
    case X - T == 0 of
        true -> T;
        false -> T - 1
    end.

ceiling(X) ->
    T = trunc(X),
    case X - T == 0 of
        true -> T;
        false -> T + 1
    end.

1> floor(-4.3).
-5
2> ceiling(-4.3).
-4
3> trunc(-4.3).
-4
4> round(-4.3).
-4
5> floor(3.5).
3
6> ceiling(3.5).
4
7> trunc(3.5).
3
8> round(3.5).
4
9> round(7).
7

The procedures all return integers.

round/1 returns the closest integer to x, rounding to even when x is halfway between two integers. trunc/1 returns the integer closest to x whose absolute value is not larger than the absolute value of x. floor/1 returns the largest integer not larger than x. ceiling/1 returns the smallest integer not smaller than x.

For the floor and ceiling functions implemented above, T will always be less than or equal to X. We just need to check if there is a difference between the two in which case we will either increase or decrease the truncation depending if we want to floor or ceiling X.

Further general information on math and rounding is available from:

MathWorld definition of the Floor Function. MathWorld definition of the Ceiling Function