[erlang-questions] Flooring integer division in Erlang?

Igor Ribeiro Sucupira igorrs@REDACTED
Sun Apr 27 09:28:05 CEST 2008


Hum... I see.
Maybe this other implementation?

floorDiv(A, B) ->
    case ((A < 0 andalso B >= 0) orelse (A >= 0 andalso B < 0))
andalso A rem B =/= 0 of
        true -> (A div B) - 1;
        false -> A div B
    end.

On Sat, Apr 26, 2008 at 11:06 PM, Dimitry Golubovsky
<golubovsky@REDACTED> wrote:
> Igor,
>
>  Thanks for the suggestion, but it does not work as needed with large
>  numbers. I tried similar things just like floor(A/B) (floor/1 was
>  found somewhere on TrapExit).
>
>  Say we want to print a factorial of 40. Each digit is obtained by
>  taking a quot and rem from division by 10. What I compute is
>  equivalent to (show . fac) in Haskell
>
>  With your function instead of div, in Haskell compiled to Erlang:
>
>  11> hserl:hslist((hserl:force(hs_test1:main()))(40)).
>  "815915283247897600060660666066242068688062066800"
>
>  Same in ghci:
>
>  Prelude> let fac 1 = 1; fac n = n * fac (n - 1)
>  Prelude> (show . fac) 40
>  "815915283247897734345611269596115894272000000000"
>
>  And when I use the standard div, in Haskell compiled to Erlang:
>
>  13> hserl:hslist((hserl:force(hs_test1:main()))(40)).
>  "815915283247897734345611269596115894272000000000"
>
>  Thanks.
>
>
>  On Sat, Apr 26, 2008 at 7:59 PM, Igor Ribeiro Sucupira <igorrs@REDACTED> wrote:
>  > You could use, for example, the BIF trunc/1.
>  >  Something like this:
>  >
>  >  floorDiv(A, B) ->
>  >     Quotient = A / B,
>  >     Truncated = trunc(Quotient),
>  >     case Truncated > Quotient of
>  >         true -> Truncated - 1;
>  >         false -> Truncated
>  >     end.
>  >
>  >
>  --
>
>
> Dimitry Golubovsky
>
>  Anywhere on the Web
>



More information about the erlang-questions mailing list