Re: [Caml-list] Parsing 64-bit ints in 32-bit OCaml

2009-03-16 Thread Jean-Christophe Filliâtre
Jon Harrop a écrit :
 I'm just trying to write efficient functions for div and mod by three. I'd 
 like to handle 32- and 64-bit machines with the same code so I tried:
 
   let gcd3 = match Sys.word_size with
 | 32 - 715827883
 | 64 - 3074457345618258603
 | _ - failwith Unknown word size
 
 That works perfectly in 64-bit but breaks OCaml's parser in 32-bit, which 
 dies 
 with:
 
   Integer literal exceeds the range of representable integers of type int
 
 As a workaround, I replaced it with:
 
   | 64 - Int64.to_int 3074457345618258603L
 
 Is there a better workaround?

I also bump into the same problem from time to time, and I usually
replace the large constant by a (launch time) computation, such as

(0x lsl 16) lor 0x

for 0x for instance. In your case, it could simply be

(3074457 * 100 + 345618) * 100 + 258603

But your solution is equally good (the int64 is boxed but is simpler to
read).

-- 
Jean-Christophe

___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


[Caml-list] Parsing 64-bit ints in 32-bit OCaml

2009-03-07 Thread Jon Harrop

I'm just trying to write efficient functions for div and mod by three. I'd 
like to handle 32- and 64-bit machines with the same code so I tried:

  let gcd3 = match Sys.word_size with
| 32 - 715827883
| 64 - 3074457345618258603
| _ - failwith Unknown word size

That works perfectly in 64-bit but breaks OCaml's parser in 32-bit, which dies 
with:

  Integer literal exceeds the range of representable integers of type int

As a workaround, I replaced it with:

  | 64 - Int64.to_int 3074457345618258603L

Is there a better workaround?

-- 
Dr Jon Harrop, Flying Frog Consultancy Ltd.
http://www.ffconsultancy.com/?e

___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


Re: [Caml-list] Parsing 64-bit ints in 32-bit OCaml

2009-03-07 Thread Jérémie Dimino
Jon Harrop wrote:
 Is there a better workaround?

A (maybe overkill) solution is to use optcomp [1]. What you have to do
is to add word_size variable:

  Pa_optcomp.define word_size (Int Sys.word_size)

Then you can write:

  let gcd3 = 
  #if word_size = 32
 715827883
  #elif word_size = 64
 3074457345618258603
  #else
  #  error unknown word size
  #endif

Jérémie
 
 [1] http://forge.ocamlcore.org/projects/optcomp/

___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs